02/12/28 01:31
>>96
どんなボケですか?
ユーザが勝手に作るJNI!=Run Anywhereは常に成立デスヨ。
101:デフォルトの名無しさん
02/12/28 01:31
>>85
CをJavaに変換するなんてとても容易にできることだとは思えないぞ。
ポインタ、アドレス操作も大変だし、
メモリリーク、配列のバッファーオーバーフロー起こすことができるCソースをそのまま
Javaに変換しても動かないし。
Cの構造体をJavaに変換するとフィールドがすべてpublic、だが値型。
構造体への構造体も値型であるから、
それをクラスの中にあるクラス(クラスの集約)として変換しても
どう考えたってそのまんまではエラー。
Javaではクラス(オブジェクト)はすべて参照型と決まっているからね。
変換したいCソースにC++コードいれたらとんでもないことになりそうだね。
ほかにも容易でない理由はまだまだあるんだけど、きりがないからこれくらいにしておこう。
CをJavaに自動変換するなんて現状ではまだ現実的とは思えないな。
JavaをCに変換するのは簡単だけどその逆は容易でない、というか、
不可逆反応です。それだけJavaが整然としたすっきりとした言語ってことだね。
JavaをC#に変換するJUMP to .NET ですら変換がうまくいかないことがあり、
RMI使っているJavaソースや一部のJava独自のライブラリをC#に変換できないというし。
ある程度は自分で書き直した方が早いんじゃないかな。
102:デフォルトの名無しさん
02/12/28 01:33
>>101
逆は作ってるヒトたまにいるね。
103:デフォルトの名無しさん
02/12/28 01:34
>>101
前橋和哉さんがそういうコンパイラ作る話題をWebに書いてなかったけ?
104:デフォルトの名無しさん
02/12/28 01:39
>>101
C言語ソース -> Javaソース じゃなくて
C言語ソース -> Javaバイトコード だったら出来るんじゃない?
それに C言語ソース -> Javaソース だったら
可変長引数の処理とかも無理っぽいし。
105:デフォルトの名無しさん
02/12/28 01:50
Cをアセンブリやマシン語には出来ても
アセンブリやマシン語をCには出来んでしょ。
Java厨にはそんなこともわからんの?
106:デフォルトの名無しさん
02/12/28 01:53
>>105
つまり、君には理解できなかったと。
107:デフォルトの名無しさん
02/12/28 02:11
>>106 わけわからん
108:デフォルトの名無しさん
02/12/28 02:22
>>105
CをJavaにするコンバータを作るのは無理だけど
JavaでCをエミュレートするのは無理じゃないって事では?
109:デフォルトの名無しさん
02/12/28 04:48
Windowsでレジストリにアクセスしたいときに使ってた。
まあ、せいぜいインストールパスを見るぐらいだけど。
後、イベントログの出力に log4j を使ったんだが、内部
ではJNI経由でDLL呼び出ししてたな。小技的に使うのが
いい感じ。
110:デフォルトの名無しさん
02/12/28 05:16
>>104
可変長引数なら、
可変長引数をあらわすこんなクラスをつくればいいんじゃないか?
import java.util.Vector;
public class VariableLengthArgument {
private int number;
private Vector vector;
public VariableLengthArgument(){
number = 0;;
}
public void add(Object obj){
vector.add(obj);
number++;
}
public Object get(int index){
return vector.elementAt(index);
}
public int getNumber(){
return number;
}
}
111:デフォルトの名無しさん
02/12/28 05:42
>>110
それだったら素直に Vector 使った方が早い。
112:デフォルトの名無しさん
02/12/28 06:03
>>110
Vector#add(Object) 使ってるかと思えば、
Vector#elementAt(int) 使ってる。統一性無いよ。
JDK1.1 との互換性気にするなら
Vector#addElement(Object)
Vector#elementAt(int)
JDK1.1 以前お断りなら
Vector#add(Object)
Vector#get(int)
あと、number 意味なしじゃない?
vector.size() 使えばよさげだし。
つーか、 >>111 の言うとおり クラス作るだけ無駄っぽい。
113:デフォルトの名無しさん
02/12/28 06:28
>>110
おまけに vector が null のまんまだから
add か get で NullPointerException 食らうし。
114:Java軍曹
02/12/28 11:30
>>110
>可変長引数をあらわすこんなクラスをつくればいいんじゃないか?
そのクラスをその様にどうしても作りたいなら、むしろ extends Vector !!
ていうか、implements Collection した別ものを用意!!
ただしその場合、内部実装は >>111氏の言うように Vectorとまったく同じッッ!!
というか自分ならむしろ、privateメンバとしてVectorを持たず、普通の配列を
持つであります!そして、java.lang.reflect.Array で newInstanceして
まるでconcatするような処理をワザワザ実装するであります!!
さらにこの場合、内部的にはただの配列なので、
ついでに、 java.util.Comparator を implementsした別クラスを用意し、
何か用がある場合、
java.util.Arrays.binarySearch(..)(スタメソ)の引数として使い、
そのComparator を継いだクラスの中で、渡された「配列の要素」をグリングリンに
いじりまわす処理を書きたいと思いますッッ!!!
(要するにComparatorであって、Comparatorで無し!!実装の上げ足取り!)
要するに”binarySearch”という響きにゾッコン☆LOVEであります!!
115:Java軍曹
02/12/28 11:42
>>114 に追記であります!!
ちなみにこの実装は、「こうしたらちょっとは早くなるかも」という
自分の妄想の産物であります!!
Vectorに格納された何らかのオブジェクト、(特に VOID* のつもりの引数)
に対処する時や、union な structのメンバに対処する時に、いちいち Vectorからgetして
getClass() して判定するのがなんとなく遅そうだと思ったのであります!!
故にッッ!!! 突っ込み所満載かもしれないでありますッッ!!!!
116:デフォルトの名無しさん
02/12/28 17:30
>>111-113
コンストラクタで new Vectorしていなかった。
確かにnumberいらないか。
Vectorそのまま使ってもいいけど、
そこに入るのは可変長引数のみであることを意識するために
別にクラス用意した方がいいかなと思った。
あと、 >>114-115 の言うとおり、引数無しvoidにも対応させるための手段も
必要かなと。
add()メソッドが動くまでget()するとデフォルトでvoid状態
remove()メソッドで全部消してget()するとvoid状態を返す
な感じに。
URLリンク(www.gimlay.org)
を見るとやっぱりクラス作った方がいいかなと。
引数のサイズの上限は255, long, doubleが入った場合は2個分として計算。
これらの振り分け処理をaddメソッドに追加した方がいいかな。
JDK1.1以前お断りでadd,get限定にしますか。
(.Net厨やJ++/J#厨からするとお断りにするなと言いそう)
117:デフォルトの名無しさん
02/12/28 17:37
public class Point3d {
public double x;
public double y;
public double z;
...
public void add(Point3d p) {
this.x += p.x;
this.y += p.y;
this.z += p.z;
}
...
}
このaddメソッド程度のものをnativeで書いた場合とどちらが速いんですかね?
そういったことを試したサイトありませんか?
118:デフォルトの名無しさん
02/12/28 18:17
昔のJavaコンパイラはCへのコンバータだったんだよね
119:デフォルトの名無しさん
02/12/29 12:50
>>117 そこまでコーディングしたなら自分で試せばいいだろ
120:Java軍曹
02/12/29 19:25
>>117
>このaddメソッド程度のものをnativeで書いた場合とどちらが速いんですかね?
この「nativeで書いた場合」とは、このスレの主旨から考えるに、当然
「このメソッドについて」、「JNIを使用する」事を想像しているものと思われるが、
その場合、処理速度の早い遅いを決めるポイントは、主に以下の2点になると思われますッッ!!
1)どれだけこのメソッドの中で完結している処理の量がある(多い)か
2)このnative宣言されたメソッドの実体(DLL)が、どれだけJavaのオブジェクトを利用するか
1について、それが「いやーこれがもう本当にループ部分とか壮絶なネストでぐーるぐるなんですよ」
だった場合、早くなるかもしれないと思われます!そして、こことも関わる話でありますが、
2について、「いやー中の処理は殆ど別のオブジェクト(Javaのクラスのインスタンス)のメソッド呼びまくりなんですよ」
だと、かえって遅くなるか、あるいはあんまり変わらない可能性が高いと思われます!!
なぜなら!DLL側で受け取るJavaのクラスのインスタンスは、プリミティブ型(この場合はラッパー)も含めて、
全ていちいちFindClassして探し出さなければならないからであります!
参考↓
URLリンク(java.sun.com)
121:Java軍曹
02/12/29 19:26
簡単に言ってしまえば、「COMを使うっぽい感じ」でありますッッ!!
122:デフォルトの名無しさん
02/12/30 03:34
>>120
それだと今回の add を JNI 化しても遅くなる可能性のが高そうだね。
123:Java軍曹
02/12/30 17:41
>>122
御意ッ!
124:デフォルトの名無しさん
02/12/31 16:47
>>122
むしろほぼ確実。
最近は、バイトコード実行速度の上昇がめざましいため
JNI呼び出しにかかるオーバヘッドの方が大きくなることが多い
よほど大きなタスクでない限りJavaで完結したほうが速いと思われる。
このスレの趣旨と真っ向から対立する話だけどな。
125:Java軍曹
02/12/31 17:25
>>124氏
正にッッ!!
JNIを「速度を求めて」あるいは「Javaで利用できない機能」を実現する手段として正しく実装したいと思うなら、
変な言い方かもしれませんが、自分が思うに、
「そのJavaアプリケーションのアドイン的な立場として」実装するのが吉ではないかと思われますッッ!!
つまり、「このnativeなヤツは、最初の引数受け取り以降、あるいは最後の戻り値以前の部分が、結構重い
(あるいはプラットフォーム固有の処理ばっかな)んスよ。」で、かつ
「いや、これはここで完結してるんで、JVMに迷惑かけないスよ」である場合に、
初めてその効能が得られるのではないか、と。
そうで無い場合、124氏の言われるように、Javaで完結するのが、本来は吉であると
思われますッッ!!
126:C++厨
02/12/31 19:26
nativeインターフェスは速いの~?(´∀`)
127:117
02/12/31 20:03
public void add(Point3d p),public native void add(Point3d p)
の2つで実際にやってみたよ.
方法はこのaddメソッドを100M回呼び,その時間を計測するというもの.
その結果,前者が40msec, nativeの方が大体4000msec.
予想通り呼び出しなんかのオーバーヘッドが大きかったということでしょうか.
ということでもう一つ.今度は↓のようなもの.
public void exe() {
double x = this.x;
double y = this.y;
double z = this.z;
for (int i = 0; i < 0xfffffff; i++) {
x += 1.0;
y += 1.0;
z += 1.0;
}
this.x = x;
this.y = y;
this.z = z;
}
単純に0xfffffff回,+1.0するだけのものだけど,
これもまたnativeと2つ作成して,今度は一回だけ呼んで時間を計測したもの.
その結果,普通の場合がおよそ5000msec,nativeは4000msec
あんまり変わらなかったですね.
JDK1.4/WinXP/1GHz/C++コンパイラは.NETのもの(よく分からない)
JNIで処理の速さを求めるのは間違いかもしれません.
よほど負荷のかかる処理でもない限り,JNIは使うべきではないと思いました.
Javaでは実現出来ないところをCなりで実装するためにあるのかも知れません.
ちなみに使用したnativeコードは次の書き込み.
128:117
02/12/31 20:10
JNIEXPORT void JNICALL Java_Point3d_add(JNIEnv* env, jobject me, jobject p){
jclass cls = env->GetObjectClass(me);
jfieldID fid_x = env->GetFieldID(cls, "x", "D");
jfieldID fid_y = env->GetFieldID(cls, "y", "D");
jfieldID fid_z = env->GetFieldID(cls, "z", "D");
jdouble this_x = env->GetDoubleField(me, fid_x);
jdouble this_y = env->GetDoubleField(me, fid_y);
jdouble this_z = env->GetDoubleField(me, fid_z);
jdouble p_x = env->GetDoubleField(p, fid_x);
jdouble p_y = env->GetDoubleField(p, fid_y);
jdouble p_z = env->GetDoubleField(p, fid_z);
env->SetDoubleField(me, fid_x, this_x+p_x);
env->SetDoubleField(me, fid_y, this_y+p_y);
env->SetDoubleField(me, fid_z, this_z+p_z);
}
JNIEXPORT void JNICALL Java_Point3d_exe(JNIEnv* env, jobject me){
jclass cls = env->GetObjectClass(me);
jfieldID fid_x = env->GetFieldID(cls, "x", "D");jfieldID fid_y = env->GetFieldID(cls, "y", "D");jfieldID fid_z = env->GetFieldID(cls, "z", "D");
jdouble x = env->GetDoubleField(me, fid_x);jdouble y = env->GetDoubleField(me, fid_y);jdouble z = env->GetDoubleField(me, fid_z);
for (int i = 0; i < 0xfffffff; i++) {
x += 1.0;
y += 1.0;
z += 1.0;
}
env->SetDoubleField(me, fid_x, (jdouble) x);
env->SetDoubleField(me, fid_y, (jdouble) y);
env->SetDoubleField(me, fid_z, (jdouble) z);
}
this.x += p.x;を実装するたけでも↑のようなコードが必要っぽい.
なんか他にいい方法ないですかね?
129:117
02/12/31 20:12
>>127の書き込み訂正
× 100M回
○ 1M回
130:デフォルトの名無しさん
02/12/31 20:20
>>127-129
レポートご苦労様っす。
131:デフォルトの名無しさん
03/01/02 14:46
>>128
GetObjectClassとGetMethodIDは一回でいいはず
なんどもやるのは無駄
132:デフォルトの名無しさん
03/01/04 10:28
GetFieldID を init に追い出してチェックしてみたら
100M回の比較で
Point3D.add::4536ms
Point3D.addNative::128084ms
Point3D.addNativeWithGetFieldID::459834ms
ちなみに C++ で Point3D を作ってやってみたら
Point3D->add::2684ms
おまけに Point2D も作ってみたけど
Point2D.add::2814ms
Point2D.addNative::86375ms
Point2D.addNativeWithGetFieldID::415858ms
Point2D->add::2614ms
133:デフォルトの名無しさん
03/01/04 11:00
GetObjectClass/GetFieldIDは案の定重いね
どちらが重かったか分かる?
134:デフォルトの名無しさん
03/01/04 11:03
やってて気づいたんだけど jdk1.4って浮動小数点演算の最適化が甘くなってるかも?
>>132 は jdk1.4.1
jdk1.3.1
Point2D.add::3205ms
Point2D.addNative::87405ms
Point3D.add::3545ms
Point3D.addNative::125200ms
jdk1.2.2
Point2D.add::2964ms
Point2D.addNative::52155ms
Point3D.add::2714ms
Point3D.addNative::73957ms
135:デフォルトの名無しさん
03/01/04 11:23
>>133
ほい。回数は先のと同じく100M回。
invokeJNIMethod::4096ms
getObjectClass::12328ms
getFieldID::74877ms
136:デフォルトの名無しさん
03/01/04 11:28
>>135
グッジョブ!
100M回って、100 * 1000 * 1000 回であってるよね?
137:デフォルトの名無しさん
03/01/04 11:35
>>136
>100M回って、100 * 1000 * 1000 回であってるよね?
そのとーりです。
138:デフォルトの名無しさん
03/01/04 15:11
>>134
浮動小数点演算じゃなくて inline 展開の仕方が悪い(?)のかも
p1.add(p2);
p2.add(p1);
と
p1.x += p2.x; p1.y += p2.y; p1.z += p2.z;
p2.x += p1.x; p2.y += p1.y; p2.z += p1.z;
で測定したら
Point3D.add::4557ms
自力計算::2694ms
みたいに差が出ました。(jdk1.4.1の場合)
jdkのバージョンによっては あんまし差が無かったりする
(jdk1.2.2だと測定誤差程度だけど自力計算のが遅かったりする)
ので面白いなぁ、と思ってみたり。
特にヘンなのが IBM のjdk1.3.0で
class Point3D extends Point2D にして
public void add( Point3D p ){
super.add(p);
this.z += p.z;
}
とかゆーふーにした場合が一番速かったり。
これ以上はHotSpotやらJITやらの知識が無いと測定しても意味無いかも…
139:デフォルトの名無しさん
03/01/04 15:21
ううむ、JIT様がガリガリ最適化したら、
どう書いても同じになりそうな気がするんだが
そうでもないのか。
140:IP記録実験
03/01/08 22:23
IP記録実験
スレリンク(accuse板)
1 名前:ひろゆき ◆3SHRUNYAXA @どうやら管理人 ★ 投稿日:03/01/08 17:13 ID:???
そんなわけで、qbサーバでIPの記録実験をはじめましたー。
27 名前:心得をよく読みましょう 投稿日:03/01/08 17:20 ID:yL/kYdMc
SETTING.TXT管轄でないということは全鯖導入を視野に、か?
38 名前:ひろゆき ◆3SHRUNYAXA 投稿日:03/01/08 17:22 ID:rLfxQ17l
>>27
鋭いです。
73 名前:ひろゆき ◆3SHRUNYAXA 投稿日:03/01/08 17:27 ID:rLfxQ17l
>ところで、IPが抜かれて何か今までと変わることってあるのでしょうか?
・今までより、サーバが重くなる。
・裁判所や警察からの照会があった場合にはIPを提出することがある。
141:デフォルトの名無しさん
03/01/09 00:42
>>69
アクセスログじゃなくって書き込み単位で記録しているだけだろ
そんな一気にはふえねーだろ
142:デフォルトの名無しさん
03/01/09 01:02
ひろゆきの悲しいときを教えれ。
143:デフォルトの名無しさん
03/01/09 01:21
>>422
別に気にはならないですね。
144:デフォルトの名無しさん
03/01/09 01:33
どうですか。( ´Д⊂
145:デフォルトの名無しさん
03/01/09 02:09
「2chでは裏でIP記録されています。IPを抜かれたくなければ
セキュリティガードに…」
というコピペを流行らせる会 会長↓
146:デフォルトの名無しさん
03/01/09 03:00
さて。2ちゃんの流浪の民を吸収できる掲示板システムを作ることが出来得るなら
これは非常に大きなビジネスチャンスだと思うのだが。
誰かやれ!
147:デフォルトの名無しさん
03/01/09 03:47
>>197
いや、ま、正論ではあるのだけどな。。
148:デフォルトの名無しさん
03/01/09 18:35
======2==C==H======================================================
2ちゃんねるのお勧めな話題と
ネットでの面白い出来事を配送したいと思ってます。。。
===============================読者数: 138720人 発行日:2003/1/9
年末年始ボケがそろそろ収まり始めた今日このごろのひろゆきです。
そんなわけで、年末に予告したIP記録ですが実験を開始しています。
「2ちゃんねる20030107」
こんな感じで各掲示板の最下部に日付が入ってるんですが、
20030107以降になってるところはログ記録実験中ですー。
んじゃ!
────────────Age2ch─
■この書き込みは、Age2chを使って配信されています。
──────────────
Keep your thread alive !
スレリンク(software板)l50
──────────────
149:デフォルトの名無しさん
03/01/10 00:20
>>493
いくらなんでも、無差別にIP公開はしないと思うが。
150:デフォルトの名無しさん
03/01/10 09:08
>>573
世の中サヨとネットと圧力で出来てると思っているお前のような奴のほうが
世の中にとっては役に立たない
151:デフォルトの名無しさん
03/01/10 10:28
>>196
いや、そんなことはないですよ。
152:デフォルトの名無しさん
03/01/10 11:05
西村氏は
廃人で雪に入って凍っているかと思ったらまだ生きていたんですね。
153:デフォルトの名無しさん
03/01/10 11:36
ちなみに、「国民クイズ」内では日本国憲法が改正され、こんな条文が追加されてる。
日本国憲法第12章104条「国民クイズは国権の最高機関であり、その決定は
国権の最高意思最高法規として、行政、立法、司法、その他あらゆるものに絶対、
無制限に優先する」
笑えるところなのかわからんが34話にはムネオたんか?と思われる方もカメオしてる。
154:デフォルトの名無しさん
03/01/10 11:57
Java Native Interface?
155:デフォルトの名無しさん
03/01/10 12:24
>>481
名誉毀損で逮捕かよ!
でも管理人、笑えないんじゃない?コレ。
156:デフォルトの名無しさん
03/01/10 12:41
>>434
現実のものとなりました。
157:デフォルトの名無しさん
03/01/10 12:51
>>942
一応ありがと。そのリンク先の1の判決文末尾の「別紙発言目録」ってのが
見たいわけなんだけど、そのスレのどっかにリンク張られてるのかな?
158:デフォルトの名無しさん
03/01/10 15:01
・圧縮やなんかでdat落ちした分を省いた
・報告無しで処理された分を省いた
・まとめが好きで好きでたまらないまとめ大好きっ子だった
159:デフォルトの名無しさん
03/01/10 16:30
あーの事ね。
大阪キタ━━━┌(_Д_┌ )┐━━━ !!!!!
160:デフォルトの名無しさん
03/01/10 22:52
お近くの警察署か裁判所へどうぞ>329さん
161:デフォルトの名無しさん
03/01/10 22:59
ニュー速以外はだいたい串通るから
IP記録は無駄無駄。。。
162:デフォルトの名無しさん
03/01/11 00:15
末期症状だな。削除問題をIP記録にすりかえてる。北朝鮮並みの姑息な対応。
163:デフォルトの名無しさん
03/01/11 00:23
ぼうやだからさ
164:デフォルトの名無しさん
03/01/11 09:48
釣りじゃないのなら実に現実味のない意見だ
165:デフォルトの名無しさん
03/01/11 09:51
まあよしゆきも控訴審の判決が出たからにはポーズだけでもとらにゃいかんだろう。
よほど悪質な犯罪予告等を除いてはよしゆきの判断次第。面倒くさくなったら、
当事者同士で問題解決してよん。んじゃ!って感じだろう。
166:デフォルトの名無しさん
03/01/11 10:22
======2==C==H======================================================
2ちゃんねるのお勧めな話題と
ネットでの面白い出来事を配送したいと思ってます。。。
===============================読者数: 139038人 発行日:2003/1/10
なにやら、連日メルマガだしてるひろゆきです。
そんなわけで、ログ記録実験ですが、いちいちサーバ指定するのが面倒なので、
全部のサーバに入れてみました。
重くなって落ちたりしてもご愛嬌ってことで。。。
んじゃ!
────────────Age2ch─
■この書き込みは、Age2chを使って配信されています。
──────────────
Keep your thread alive !
スレリンク(software板)l50
──────────────
167:デフォルトの名無しさん
03/01/11 11:16
大作死ね!とか欠いたら危険になるのかな?
168:デフォルトの名無しさん
03/01/11 11:47
会同
※この書き込みはフィクションです。
実際の団体・人物・民族等とは一切関係ありません。
169:デフォルトの名無しさん
03/01/11 12:49
このスレのIPとって訴訟するのだけは止めてくれよ。クチビルゲ。
スレリンク(kao板)
うわっ何かクラックされて勝手に文章が・・・あ、さらにポインタが書き込みボタンに・・・あわわわ!!
170:デフォルトの名無しさん
03/01/11 13:18
俺もそう思う。高い金自腹で払って掲示板を運営してて
何処の誰かも知らん奴が勝手なこと書いた事によって
自分に火の粉が飛んで来たら、秘密を守ってやる義理は
ないよなひろゆきにしたら。
171:デフォルトの名無しさん
03/01/11 16:05
まぁなんだ
「ひろゆきよ ラウンジが重いんだが・・・と電話しまくって即閉鎖」
が一番早そうだな(藁
172:デフォルトの名無しさん
03/01/11 16:11
復活してちょっとうれしい今日の漏れ
173:デフォルトの名無しさん
03/01/12 00:12
>>IP記録
告発ネタが減少するのは残念。
・WTCテロのリーク
・西部の松坂の駐車違反
・牛肉買い上げの告発
等々、
いろいろとおいしいネタがあったのになあ。
おまえらの知ってる2ちゃん内の告発ネタを教えてください。
174:デフォルトの名無しさん
03/01/12 00:22
良識ある書き込みをしろ
175:デフォルトの名無しさん
03/01/12 03:00
はピン子のAAだったのか(w
176:デフォルトの名無しさん
03/01/12 03:03
国税庁のHP
177:デフォルトの名無しさん
03/01/12 10:32
マスコミって単純だね。
ほんと馬鹿だよな。
178:デフォルトの名無しさん
03/01/12 10:36
正当性を高める必要は全くないな… 知ったかぶりしていた&判決すらちゃんと読んでないな僕は。
まさか弁護士がついてるのに「本件にはプロバイダー責任法が適用され,同法の制定経緯,規制範囲等に照らすと,被告が本件各発言を削除しなかったことにつき削除義務違反はない」と主張するなんて常識的に考えられなかったので…
寝ぼけてたのかな?恥ずかしい(^^; ゴメンナサイ> 231&253
179:デフォルトの名無しさん
03/01/12 21:12
/⌒ヽ
/ ´_ゝ`) IP子です。よろしこ
| /
| /| |
// | |
U .U
180:デフォルトの名無しさん
03/01/12 21:14
>626
・・・
デンパでしゅか?
181:デフォルトの名無しさん
03/01/12 21:27
いえいえ、誘導どうもありがとうございます。
182:デフォルトの名無しさん
03/01/13 15:44
>>139
JIT様の最適化にも癖があるよーで…
183:山崎渉
03/01/13 18:54
(^^)
184:山崎渉
03/01/15 18:08
(^^)
185:デフォルトの名無しさん
03/01/18 00:09
>>182
いわゆるJITってクラス境界を越えたinline化はしないのかな?
そうでもしないと限界がすぐに見えちゃう気がするけど。
最近JNIをやってるのですが、JNI Callしたあとって必ず
Exceptionのチェックをしないとダメなんですかね?
かなりウザいんですが・・・
下がりすぎてるようなのでage
186:デフォルトの名無しさん
03/01/18 05:08
eclipseでJNIを使ったプロジェクトを開発中ですが、LoadLibrary()で止まってしまいます。
dllはどこに置けばいいのでしょうか。
eclipseスレで聞いたほうがよかったのかな。
187:デフォルトの名無しさん
03/01/18 10:02
確かPATHの通ってるところ
188:デフォルトの名無しさん
03/01/18 10:03
>>185
> Exceptionのチェック
んなわけない
189:デフォルトの名無しさん
03/01/18 10:15
>>186
Windows が使用する DLL 検索パス
URLリンク(www.microsoft.com)
他にもレジストリとか見てたよーな気がするんだけど気のせいかも…
190:デフォルトの名無しさん
03/01/18 11:34
>>188
そうなの?FindClassとかGetMethodIDとかは戻り値が0だったら
エラーが起こってるのは判るけど、
CallObjectMethodとかだと戻り値だけじゃわかんないやん。
で、一度exceptionが起こると、続くJNI呼び出しはおかしくなるようです。
つかjava.exeが固まります(jdk1.4.1)。というわけで
env->CallIntMethod();
check();
env->CallObjectMthod();
check();
...
なんていうコードを書くハメになったりするわけですが、激しくダサい。
191:デフォルトの名無しさん
03/01/18 22:10
>>190
URLリンク(www.ki.rim.or.jp)
なんかが参考になるかもね
192:デフォルトの名無しさん
03/01/18 22:21
>>190
呼び出しが例外を起こす可能性があるなら、
必ずチェックしなければならない。
188は嘘。騙された190はご愁傷さま。
193:186
03/01/18 23:50
もいっちょお願いします。
.dllをJARに入れて配布するには、どうMANIFESTファイルを設定すればいいでしょうか。
194:デフォルトの名無しさん
03/01/19 18:20
>>193
>.dllをJARに入れて配布するには
無理じゃない?
195:188,191
03/01/19 22:17
>>192
必死だと思われようがあえて書く。
185は "JNI Callしたあとって必ず" とあるから
"んなわけない" と書いたんですが。
例外を投げる可能性がある場合に
チェックしないといけないのは当たり前。
196:デフォルトの名無しさん
03/01/19 22:20
voidさんいらっしゃい。
197:山崎渉
03/01/23 20:11
(^^)
198:むー
03/01/24 04:05
>>190
Javaメソッド呼んだ後にExceptionOccurredでチェックして例外発生して
たらC++例外投げるようなJNIEnvのラッパーみたいなの書いて、
nativeメソッド全体をtry-catchで囲んどいてラッパーから投げたC++例外
をキャッチしてJava側にさっくり戻る、みたいなことやったりしたらだめかね?
199:デフォルトの名無しさん
03/01/24 23:46
>>198
結局そうなりますた。
が、windowsでは動きましたがlinuxではJVMがクラッシュしますた。
例外が原因らしいことまでは分かったのですが・・・
200:デフォルトの名無しさん
03/01/25 09:26
>>199
そんなに甘くないのか… なんでだろう?
Linux版のJVMではJava例外の実装にC++の例外機構の何かを使って
バッティングしちゃった、とかそんな理由なんかな。
stack-unwindでJVMのスタックかどっかを破壊しちゃうとか。
core見ないとわかんなそうだけど、JVMのcore読みなんて鬱すぎる…
201:デフォルトの名無しさん
03/01/26 06:15
>>199
try catch なんてハイカラなもの使わずに goto するしか!
202:デフォルトの名無しさん
03/01/26 09:25
>>201
c++のデストラクタを活用してるコードがあるのよ・・・
203:デフォルトの名無しさん
03/01/26 09:37
>>200
こんなのありますた
URLリンク(mail.gnu.org)
ショボーン
URLリンク(mail.gnu.org)
ショボーン
URLリンク(wmf.editthispage.com)
204:デフォルトの名無しさん
03/01/31 00:01
>>203
赤帽7.2とgcc2.96で、JDK1.4.1な環境だが、試したら大丈夫だたよー
205:デフォルトの名無しさん
03/02/01 13:27
>>204
マジですか?
つかgcc2.96ってどういうバージョンなんでしょう
本家には置いてないし・・・
206:204
03/02/02 07:38
>>205
GNUでは2.96は開発版で配布に適さないといってるみたい。
URLリンク(gcc.gnu.org)
でも、RedHat社のサイトにはRPMがまだあるみたいだね。
2.95や3.xと互換性はないらしいが。。。
2.95.2とか、3.2とかじゃうまくいかないのかな。
204の環境は借り物だったんで、他はわからんですわい。スマソ
207:デフォルトの名無しさん
03/02/20 17:08
JNI通すところ自体はね。
208:デフォルトの名無しさん
03/02/20 17:14
なんでわざわざC++でつくられたバイナリをJAVAから使う必要があるのだ?
perlにしといたら?
209:デフォルトの名無しさん
03/02/20 17:22
>>208
なんでわざわざC++でつくられたバイナリをperlから使う必要があるのだ?
210:デフォルトの名無しさん
03/02/20 17:40
>>208
Javaでコーディングする部分のOSへの依存を下げるため
211:デフォルトの名無しさん
03/02/20 17:58
この間初めて JNI 使って Windows の CPU 使用率をとってみた。
結構簡単だった。
212:デフォルトの名無しさん
03/02/20 19:46
>>211
SNMP使えば、Windows でも Linux でも同じコードで CPU使用率とれるのに。。
213:デフォルトの名無しさん
03/03/07 21:59
URLリンク(page5.auctions.yahoo.co.jp)
ヤフオク出品したよ
1円スタートでマジお勧め!
「10日でおぼえるJSP/サーブレット入門教室」翔泳社
214:デフォルトの名無しさん
03/03/07 22:05
あげ荒らし氏ね
215:電波さん
03/03/16 03:16
現在VMに興味があって最近勉強しだしたところ。
このスレ結構面白いです。
JNIなんて「共有オブジェクト読んで関数呼べば良いんだろ」程度に思ってたけど
結構やること多いのね。nativeコードからのJavaVMの呼び出しなんて念頭になくって
これから調べないといけないです。
勉強になります。
216:デフォルトの名無しさん
03/03/22 08:12
勃起age
217:デフォルトの名無しさん
03/03/22 12:57
いろいろ書籍やWEBサイトを参考にしてるんだが
どうやってもCからJVMをロードできない。
何か根本的に間違えてるのだろうか。
218:デフォルトの名無しさん
03/03/22 17:08
>なんでわざわざC++でつくられたバイナリをJAVAから使う必要があるのだ?
あなたTYPE2のJDBCドライバを使ったこと、ありませんか?
219:デフォルトの名無しさん
03/03/23 02:58
Pure じゃなくても、少しくらい汚れてしまった Java の方が萌える
>>212
SNMP って ICMP じゃなかったっけ?
220:デフォルトの名無しさん
03/03/23 08:51
>>219
> SNMP って ICMP じゃなかったっけ?
ハァ ? プロトコルの勉強しなおした方がいいんじゃない ?
URLリンク(www.arkweb.co.jp)
221:山崎渉
03/04/17 15:51
(^^)
222:デフォルトの名無しさん
03/04/19 13:47
結論:全部C++で。これ最強。
223:山崎渉
03/04/20 03:39
∧_∧
( ^^ )< ぬるぽ(^^)
224:デフォルトの名無しさん
03/04/27 13:02
JavaでHello World JNI編
URLリンク(www.hellohiro.com)
225:山崎渉
03/05/28 13:13
∧_∧
ピュ.ー ( ^^ ) <これからも僕を応援して下さいね(^^)。
=〔~∪ ̄ ̄〕
= ◎―◎ 山崎渉
226:デフォルトの名無しさん
03/06/11 05:51
swig使ってJNI部分を自動生成してみたんだけど結構便利そう
URLリンク(swig-jp.dyndns.org)
227:デフォルトの名無しさん
03/06/15 00:11
いえいえ、誘導どうもありがとうございます。
228:デフォルトの名無しさん
03/06/15 00:43
/⌒ヽ
/ ´_ゝ`) IP子です。よろしこ
| /
| /| |
// | |
U .U
↑ゲーム製作技術板のなんとか君みたい!
ここのマスコットキャラにしよう
229:山崎 渉
03/07/15 10:51
__∧_∧_
|( ^^ )| <寝るぽ(^^)
|\⌒⌒⌒\
\ |⌒⌒⌒~| 山崎渉
~ ̄ ̄ ̄ ̄
230:山崎 渉
03/07/15 14:02
__∧_∧_
|( ^^ )| <寝るぽ(^^)
|\⌒⌒⌒\
\ |⌒⌒⌒~| 山崎渉
~ ̄ ̄ ̄ ̄
231:山崎 渉
03/08/02 02:52
(^^)
232:デフォルトの名無しさん
03/08/15 05:24
こんにちは,教えてください。
趣味でUSBデバイスを作ろうとしているのですが,
汎用USBドライバがUUSBD.DLLというものを
通して利用できることがわかりました。
JNIを使えばJAVAからDLLを使うことができるのでしょうか?
JNIの使い方を調べたら,
1.JAVAでソースを書く。
2.コンパイルする。
3.ヘッダファイルを作る。
4.インクルードしてC等でDLLを作成する。
になっていました。
しかし,この場合だと,UUSBD.DLLを
自分で作り変えることになってしまうと考えるのですが,
拾ってきたDLLをそのまま使うことはできますか?
233:デフォルトの名無しさん
03/08/15 06:06
やったことないけど。
Cで作成したDLLからそのUUSBD.DLLをいじればいいのでは?
234:デフォルトの名無しさん
03/08/15 14:26
>>232
UUSBD.DLLを使用するプログラムを
JNIにすればいいだけではないのか?
間にかませるって言うことだ
235:山崎 渉
03/08/15 15:10
(⌒V⌒)
│ ^ ^ │<これからも僕を応援して下さいね(^^)。
⊂| |つ
(_)(_) 山崎パン
236:デフォルトの名無しさん
03/08/16 09:32
からあげうまうま
237:デフォルトの名無しさん
03/08/17 19:13
俺、cの知識がないからよくわかんないんだよね。
どうやったらいいの?
やっぱcの勉強しないと駄目ですか?
駄目ですよね・・・。
238:デフォルトの名無しさん
03/08/17 19:16
>>237
お前はアセンブリで充分だ。
そんな高級な言語使うな
239:デフォルトの名無しさん
03/08/17 23:15
JNI本買わないとやっぱ駄目なのかな。
Webで検索したけどほとんど情報無いよ。
240:デフォルトの名無しさん
03/08/18 00:29
このスレ頭から30過ぎくらいまで読んだんだけどさ。
Java次世代コボル決定!
ごめんね10年後のプログラマ達
っていうサブタイトルつけていいですか?
241:デフォルトの名無しさん
03/08/18 00:42
>>240
さびれたスレに即レスするのもなんだが、アオるにしても、下手な文章だな。
JNIは、jdk1.5を目前としているいまでは、ほとんど使う必要がないだろう。
GUI周りで、どうしても、使いたいネイティブのAPIがあるときだろうが。
SWTに関していうと、あれはかなり微妙だな。サンがクライアントサイドを本気で取り組めば、存在は消えていく。
逆に、アポーだと、IBMに完全にイニシアチブをとられる流れで、クライアントサイドはSWT一色になる可能性も、
すくないが秘めている。
242:デフォルトの名無しさん
03/08/18 01:29
>>241
Javaアプリから、WinのネイティブAPIを叩かなければならないような
仕組みを作る羽目になったときは、つかうど。
「誰だ、この仕組み考えた奴は!」と設計者を呪いながら(ワラ
243:240
03/08/18 02:11
>>241
別に煽っても釣ってもないです。
JNIの存在意義と正しい使い方がわかってないのに
JNIとか叫んでる人達(>>1-30くらいで痛いほど見れます)が大杉。
必要性云々ではなくて機種依存性を正しく局所に押さえ込めてますか?
もっというとネイティブAPIをちゃんとラップして使ってますか?
っていうレベルで。>>1-30を見ると正直怪しい。
SWTとかどうでもいいよ。
コンポーネントとして成立してればその部分を移植できれば他でも動くんだからさ。
244:デフォルトの名無しさん
03/08/18 07:49
> JNIは、jdk1.5を目前としているいまでは、ほとんど使う必要がないだろう
何か素晴らしい仕組みが1.5には入るの?
245:デフォルトの名無しさん
03/08/18 14:07
swigならJNIで使うヘッダや関数を定義したファイルを作れば
自動的に定義された関数にアクセスするC言語のJNIソースと
Javaソースを自動生成してくれるのに
Java使いは誰も知らなさそうなのが残念
246:デフォルトの名無しさん
03/08/18 17:09
俺はSWINGというより、レジストリアクセスやウィンドウキャプチャとか
アーカイバDLLで圧縮処理とかそう言うレベルの仕事がしたかったんだけど。
Javaで。
無理かな?
247:デフォルトの名無しさん
03/08/18 18:00
>>246
swig
URLリンク(swig-jp.dyndns.org)
swing
URLリンク(java.sun.com)
248:デフォルトの名無しさん
03/08/18 20:08
Tigar (Java2 SE 1.5) のJava 言語仕様の拡張
URLリンク(www.mtl.t.u-tokyo.ac.jp)
genericsとautoboxingはうれしいな。for はなんかスクリプトっぽくて気持ち悪い。
aspectjは入らんのな。プロパティの設定は面倒くさいまんまか。
249:デフォルトの名無しさん
03/08/18 20:48
>>248
隼(1.4)から虎(1.5)へ~JDK1.5について!
スレリンク(tech板)l50
【猿が】JavaニGenericsハ不要 【ソース汚す】
スレリンク(tech板)l50
あたりでやってくれ。
250:246
03/08/19 13:07
>>247
ちょっと逝ってくる。
ただいま。
251:デフォルトの名無しさん
03/08/19 15:23
おかえり
252:デフォルトの名無しさん
03/08/20 16:16
age
253:デフォルトの名無しさん
03/09/18 02:15
sage
254:デフォルトの名無しさん
03/09/25 20:58
それでもおまいらはJNIをおいそれと使いますか?
255:デフォルトの名無しさん
03/09/25 22:59
java から c を呼び出すのでなく
c から java を呼び出すのに最近はまってる。
ライブラリが充実してて非常によい。
普通に c/c++ のライブラリ使えという話もあるが。
256:デフォルトの名無しさん
03/09/28 06:32
>>255
むしろ普通にJavaを使え。
JNIでスタートアップルーチンだけ用意して。
257:デフォルトの名無しさん
03/09/28 08:12
>>1
レスを荒らす方法を教えてください。。。
258:デフォルトの名無しさん
03/10/01 05:33
C言語からJavaを呼び出すのってバージョン依存激しそうに見えるんだけどそうでもない?
259:デフォルトの名無しさん
03/10/01 23:33
>>258
Java のバージョンとは別に JNI にもバージョンがあって
JNI 1.1 と 1.2 ではだいぶ書き方が違うけど
Java 1.2 から 1.4 まで全部 JNI 1.2 だったと思うから
バージョン依存の問題はあんまりたいしたことない。
260:デフォルトの名無しさん
03/10/13 17:03
JAVAでCDプレーヤーを作るコツを教えて下さい。難しいでしょうか?
261:デフォルトの名無しさん
03/10/14 23:07
gcj + swtでwindows用の
アプリケーションを作ろうと思っています。
waveやmidiを鳴らしたいのですが、
gcjでは実装されていません。
jniを用いたクラスライブラリは存在しないでしょうか?
よろしくお願いします。
262:デフォルトの名無しさん
03/10/15 00:00
win32apiのJNI用ラッパか・・・
MSが自社用JavaVM専用に作ろうとしてSunとケンカして以来、
大きなものは誰も作ってないと思う
263:261
03/10/17 21:03
>262
レスありがとうございます。
自分の必要な分はwin32APIを
勉強して、なんとかできました。
264:デフォルトの名無しさん
03/10/26 21:47
swigつかって自分でSDLのラッパー作ってみればどうよ
265:デフォルトの名無しさん
03/10/27 23:53
javahでヘッダが出来るじゃないですか。んで
java_パッケージ名_クラス名_関数名(ネイティブメソッド)
ってなりますけど、既存の関数呼ぶにはやっぱりこの長い名前の関数から
呼ぶしかないですかね。教えてください。
266:デフォルトの名無しさん
03/10/28 00:45
>>265
swig使ったら自動的に生成してくれますよ
267:265
03/10/28 22:54
自動で生成って。。。
既存の関数名では出来ないですかね?
調べてみます。
268:デフォルトの名無しさん
03/10/31 13:49
できないからswig使えってことじゃないの?
269:デフォルトの名無しさん
03/11/06 14:32
JAVAでC呼び出すなら最初からCで記述すればよくないですか?
何かメリットでもあるんでしょうか?
270:デフォルトの名無しさん
03/11/06 14:36
>>269
最終的に機械語にするんなら、なんで最初から機械語で書かないで C言語を使うのか?
ってのと同レベルの疑問だね。
271:デフォルトの名無しさん
03/11/06 14:36
JavaでCを使うのは既存のC言語ライブラリが長年使われているもので
実績があるもので、それを何とか再利用したいときなどにメリットがある。
けれどもJNIはJavaにとって苦肉の策。
基本はJavaで、というのが美しい。
272:デフォルトの名無しさん
03/11/06 15:12
>>271
おまえ、プログラマ?
デベロッパ用のソフトなんてJNIが絡んでるの多いぞ
そういうの作らないとわかんないとは思うけど
273:デフォルトの名無しさん
03/11/06 15:31
BASICから機械語呼び出すのとおんなじ
あああ懐かしい
274:デフォルトの名無しさん
03/11/07 11:34
JAVAからCを呼び出してPRINTFを使って文字を出力する単純な処理ができません。
ライブラリを作ってパスを通してもライブラリが見つからないというようなメッセージが出てしまいます。
どのようにすればいいのでしょうか?
275:デフォルトの名無しさん
03/11/07 11:38
>247
随分難易度の高いことしてんなー
わかったら本でも書け
276:デフォルトの名無しさん
03/11/07 22:13
CにSTRINGの文字列を引数として読み込む時に何で構造体を使わなくてはいけないのですか?
277:デフォルトの名無しさん
03/11/07 22:23
>>276
STRING って何? STRING は (String(Java) == jstring(JNI)) と同等?
jstring だと構造体っても struct _jobject; (もしくは class _jobject{};)だし…
278:デフォルトの名無しさん
03/11/08 00:37
Cで作成した関数をjavaから呼び出したい場合、
JNIEXPORT~の形にすると思うんですが、
プロトタイプ宣言の部分はJNIには不要ですよね?
消してしまって問題ないですか?
279:デフォルトの名無しさん
03/11/08 01:42
>>278
構造体の話は何処行ったんだ?
> 消してしまって問題ないですか?
それは javah が自動生成したコードを削って良いかって話ですか?
javah が生成したファイルの先頭に
> /* DO NOT EDIT THIS FILE - it is machine generated */
って書いてあると思うんだが…
280:デフォルトの名無しさん
03/11/08 01:44
, --- 、_
/ミミミヾヾヽ、_
∠ヾヾヾヾヾヾjj┴彡ニヽ
/ , -ー‐'"´´´ ヾ.三ヽ
,' / ヾ三ヽ
j | / }ミ i
| | / /ミ !
} | r、 l ゙iミ __」
|]ムヽ、_ __∠二、__,ィ|/ ィ }
|  ̄`ミl==r'´ / |lぅ lj >>1 諦めろ
「!ヽ、_____j ヽ、_ -' レ'r'/
`! j ヽ j_ノ
', ヽァ_ '┘ ,i
ヽ ___'...__ i ハ__
ヽ ゙二二 ` ,' // 八
ヽ /'´ / ヽ
|ヽ、__, '´ / / \
281:278
03/11/08 09:23
C単体で動くプログラムはできていて、そのプログラム内で使われている関数をJAVAから呼び出したいと思っています。
C単体で実行はしないのでCのソースのプロトタイプ宣言の部分は削っても問題ないですか?
という質問です。
282:デフォルトの名無しさん
03/11/08 13:58
>>281
> C単体で実行はしないのでCのソースのプロトタイプ宣言の部分は削っても問題ないですか?
オマエの手元にしかないソースに判断求められてもねぇ…
基本的に削ると何かメリットがあるのか良く考えてみた方が良いような。
283:デフォルトの名無しさん
03/11/08 14:49
>>281
構造体の話はどこいったんだ?
284:デフォルトの名無しさん
03/11/08 18:36
Cで適当に作った関数はプロトタイプ宣言をしなくてもJNIで呼び出せたので、別にプロトタイプ宣言なんてしなくてもいいじゃんと思いこんでいるのですが、そんな問題では無いのでしょうか?
285:デフォルトの名無しさん
03/11/08 19:42
おまいらのやっている事VBと同じやん。
286:デフォルトの名無しさん
03/11/08 20:09
>>284
構造体の話はどこいったんだ?
> Cで適当に作った関数はプロトタイプ宣言をしなくてもJNIで呼び出せたので、別にプロトタイプ宣言なんてしなくてもいいじゃんと思いこんでいるのですが、そんな問題では無いのでしょうか?
とりあえず、JNI に関する質問ではないので C の初心者スレにでも言って聞け。
287:デフォルトの名無しさん
03/11/08 22:48
JNIを扱うには、CとJavaとOSに精通してないと厳しいぞ。
288:デフォルトの名無しさん
03/11/08 23:21
>>287
おまいの言っている事VBと同じやん。
289:デフォルトの名無しさん
03/11/08 23:27
>>287
CとJavaとOS について初心者よりマシっつー程度の知識があれば JNI 使えます。
290:デフォルトの名無しさん
03/11/09 12:59
でもJNIの初心者向けのサイト行っても引数としてオブジェクト使ったり構造体のポインタをオブジェクトに対して使ったり、もう暗号みたいになっててよくわからんですよ。
優しく解説されている本とかあるんでしょうかね?
291:デフォルトの名無しさん
03/11/09 13:41
>>290
> でもJNIの初心者向けのサイト行っても引数としてオブジェクト使ったり構造体のポインタをオブジェクトに対して使ったり、もう暗号みたいになっててよくわからんですよ。
それは精進が足りん、ってだけの話では?
とりあえず、キミが JNI は良くわからない、と思っている事だけはわかった。
何がわからないのかはサッパリわからない。
292:デフォルトの名無しさん
03/11/09 17:59
JNIとは関係なくプロトタイプ宣言はしておいたほうがいいよ。
コンパイラが型チェックしてくれてコーディングミスを指摘してくれる。
293:デフォルトの名無しさん
03/11/09 23:01
SwigつかってJavaからSDLを使うラッパー作ったけど公開してほしい人っている?
294:デフォルトの名無しさん
03/11/10 10:02
>>293
公開したいんだろ? 公開したらいいじゃん。
まったく、いやらしい言い方する奴だな。
295:デフォルトの名無しさん
03/11/11 03:45
>>294
うぅ・・・気をつけます、どうやら誰も要らないみたいなんでひっそり封印します
296:デフォルトの名無しさん
03/11/14 13:59
日本語の文字列の受け渡しがさっぱり分からないのですがサンプルに書いてある通りに書いてみて、
こういうもんだと割り切って詳しく理解する必要はありませんか?
297:デフォルトの名無しさん
03/11/14 15:43
>>293
誰かが JSDL ってのを公開してたような…
298:デフォルトの名無しさん
03/11/14 15:46
>>296
> こういうもんだと割り切って詳しく理解する必要はありませんか?
その程度の情報で同意を求められても…
文字列は UTF 使うってのを忘れてる、とかじゃなくて?
299:デフォルトの名無しさん
03/11/19 14:39
Cで作った文字配列をJAVAに返すやり方がいまいちわかりません。
簡単な方法はありませんか?
300:デフォルトの名無しさん
03/11/19 15:47
>>299
C の char配列を Java の byte配列に変換して渡してやるか、(渡された先で String に変換する)
JNI 経由で java.lang.String のコンストラクタ String(byte[] bytes,String encoding) を呼び出せ。
301:デフォルトの名無しさん
03/11/19 16:29
C側のネイティブ関数の戻り値はJSTRINGじゃないですよね?
UTFって使わなくていいんでしたっけ?
302:デフォルトの名無しさん
03/11/19 17:48
>>301
それは JNI とは関係ない話だ。自分で調べろ。
303:デフォルトの名無しさん
03/11/19 19:56
UTF8になってるならサポート関数があったと思う
304:デフォルトの名無しさん
03/11/19 20:37
>>303
それは >>296 のサンプルに書いてあると思われ。
305:デフォルトの名無しさん
03/11/20 14:31
すみませんでした。
知ったかぶりしてますた。
306:デフォルトの名無しさん
03/11/20 19:19
SPRINTFで取得した文字列をNEW OBJECT ARRAYを用いて作った配列に格納したいのですがJAVAプログラムの実行時にエラーが出てしまいます。
何かよい方法はないでしょうか?
307:デフォルトの名無しさん
03/11/20 19:25
>>306
> SPRINTFで取得した文字列をNEW OBJECT ARRAYを用いて作った配列に格納したいのですが
C での文字列と Java での文字列は別物として考えたら?
あと、大文字小文字は正確に書け。
> 何かよい方法はないでしょうか?
JNI に手を出す前に C か Java をちゃんと勉強する事をお勧めする。
308:デフォルトの名無しさん
03/11/20 19:48
もちろん別の配列として扱っています。
ようはCの配列の中身をJava側の配列に入れたいのですが、
New jObjectで作った配列には文字変数の指定しかできないため、文字配列を指定して入れる事が難しいのです。
他の方法はありませんか?
309:デフォルトの名無しさん
03/11/20 19:52
>>308
「New jObject」って何よ。
310:デフォルトの名無しさん
03/11/21 00:46
>306
ようするにキャラクタ配列をオブジェクト配列に入れたいということ?
型が違うから、char型をCharacterオブジェクト型にしないといけないと思うけど。
JNI使うと、エラー発生時に"このエラーをSUNに報告してくれみたいな"のが出たりして
大変だと思うけど地道に頑張ってください。
311:デフォルトの名無しさん
03/11/21 01:46
ここもネタ心者が出没するよーになったか。
文字列の受け渡しで二週間もハマる馬鹿が実在するとも思えんしなぁ…
312:デフォルトの名無しさん
03/11/21 01:47
>>310
>>274
313:デフォルトの名無しさん
03/11/21 01:54
>>308
構造体はどーなりましたか?
314:ネタ心者
03/11/21 09:25
すみませんでした。
知ったかぶりしてますた。
315:310
03/11/21 09:30
>311
真面目に困ってるかと思っちまいました。
316:デフォルトの名無しさん
03/11/24 13:15
JNI_OnUnloadって本当に使える?
デバッグ出力してみたけど、通ってるように見えない。
317:デフォルトの名無しさん
03/11/24 18:48
int data[512*384];
jintArray jdata = env->NewIntArray(512*384);
env->SetIntArrayRegion(jdata,0,512*384,data);
によってできた配列jdataのメモリを明示的に開放する必要はありますか?
318:デフォルトの名無しさん
03/11/24 19:04
>>317につけたし。
最後に
return jdata;
します。
319:デフォルトの名無しさん
03/11/24 19:46
解放ってどうやってやるつもりだ?freeか?
320:デフォルトの名無しさん
03/12/20 04:24
c++でウィンドウを作り,Javaから呼び出しています。
メインのウィンドウは出ますが、ダイアログが出ません。
同じソースファイルをcから呼ぶとダイアログも表示されます。
だれか教えてください。
321:デフォルトの名無しさん
03/12/20 09:42
>>320
環境が分からん。Win32か?
322:デフォルトの名無しさん
03/12/20 16:14
320です。
すみません。win32です。VC++6でdllをつくりました。
どうやらリソースエディタで作った、メニューやダイアログが
うまく読み込めてないみたいです。
どなたかアドバイスお願いします。
323:デフォルトの名無しさん
03/12/20 17:08
>>322
具体的に、どんな関数をどのような順番で呼んで、どこで失敗したのか特定しろ。
324:デフォルトの名無しさん
03/12/20 17:30
320です。
C++ではjavaから呼ばれる関数、
そこから呼ばれるWinMain()に相当する関数、
それとメインウィンドウとダイアログの
ウィンドウプロシージャを用意しました。
WinMain()に相当する関数ではメインウィンドウの登録、
メッセージループなど一般的なWin32SDKのWinMain()で
やるようなことをしています。
インスタンスハンドルはGetWindowLong()でデスクトップの
ハンドルを取っています。
メインウィンドウのウィンドウプロシージャでは、ダイアログを開くための
DialogBox()を呼んでいて、ここで失敗し-1が帰ってきます。
325:デフォルトの名無しさん
03/12/20 17:32
わかりにくかったら申し訳ございませんが、よろしくお願いします。
320でした。
326:デフォルトの名無しさん
03/12/20 18:35
>>324
そんな説明されてもわからん。
オマエの説明じゃ埒明かんのでソース全部晒せ。
327:デフォルトの名無しさん
03/12/20 21:48
>> インスタンスハンドルはGetWindowLong()でデスクトップの
>> ハンドルを取っています。
明らかにここだろ、問題は。DllMainのHANDLEを使えばいいのでは?
328:デフォルトの名無しさん
03/12/21 04:32
320です。
できました!本当にありがとうございました。327さんのおっしゃる通りでした。
皆様何度もレス頂いて本当にありがとうございます。
329:デフォルトの名無しさん
04/01/23 01:14
Cコードってデバッグできますか?
jdbでブレイクポイント設定しても止まってくれないです。
330:デフォルトの名無しさん
04/01/23 09:15
>>329
VC++でしかJNI作ったことないけど、停止できるよ。
ちゃんと実行するプロセスにjava.exe(に相当するもの)を指定してる?
331:デフォルトの名無しさん
04/03/14 00:49
あんまり人いないね・・・なのであえてage。
最近USBデバイスと通信する必要があったのでJNIを試した。
で、下のようにエラーを通知しようとしたら、日本語文字列が化けますた。
jclass jc = env->FindClass( "java/io/IOException" );
env->ThrowNew( jc, "日本語文字列" );
下のサイトを参考にUnicodeに変換しても駄目。
URLリンク(www.ki.rim.or.jp)
仕方ないのでExceptionのサブクラスを作ってエラーメッセージを固定した。
当初の目的は果たせんだけど、すっきりしない。誰か解決法知らない?
332:デフォルトの名無しさん
04/03/14 01:01
日本語で困ったことはないな。
お前のコードが腐ってるんだろうよ。さらしてみ。
333:331
04/03/14 01:11
上のサイトの一番下のDLL側コードの
char* src = "こんばんわ";
より下のソースをreturn result; → env->ThrowNew( jc, result);に
変更しただけなんだけど・・・
334:デフォルトの名無しさん
04/03/14 01:20
そのサイトのコードそのままだと日本語はちゃんとでるの?
335:デフォルトの名無しさん
04/03/14 01:52
>> env->ThrowNew( jc, result);に
2番目、jstringじゃだめでしょ。
szWideでいけない?
336:デフォルトの名無しさん
04/03/14 03:25
CのプログラムからHORB(つまりJAVAをつかった関数)をつかって離れた端末の関数をたたくってことはできますか?
337:デフォルトの名無しさん
04/03/14 03:31
>>336
できるよ。
HORB使うと決まっているのなら、CのプロセスとJavaのプロセスを両方たてて、
socketなんかでプロセス間通信したほうが楽だと思う。
338:デフォルトの名無しさん
04/03/14 04:09
>>337
情報ありがとうございます。
それならば、Cのプロセスと離れた端末のCのプロセスでソケット通信した方がいいですね。
HORBは、非常に簡単に離れた端末の関数をたたけるのは知っています。
C<->JAVA間のインタフェース設計が、普通に関数をたたくように設計でき、かつ簡単ならばチャレンジしようかなと思ったしだいです。
339:デフォルトの名無しさん
04/03/14 14:56
なぜにいまさらHORB?
RMI-IIOPするほうが現実的かと。
340:331
04/03/15 23:35
試した結果、>331であげたサイトのままだと無理だった。
nWideLength以下を下のように変更すると日本語を正しく表示できた。
int nWideLength = MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED,src, strlen(src),0,0);
MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED,src, strlen(src),szWide,nWideLength);
jstring result = env->NewString(szWide, nWideLength);
return result;
で、そのままreturn result; だけをenv->ThrowNew(jc,result);もenv->ThrowNew(jc,szWide);
にしても日本語は文字化けしたままだ。もうだめぽ。
341:デフォルトの名無しさん
04/03/16 01:10
んー、そこまではできてるなら
ThrowNewはあきらめてThrowを使うとか。
Exceptionのインスタンスはjstring引数にして生成する。
342:341
04/03/16 01:35
あー、わかった。そこでできてるWCHARを
WideCharToMultiByteでCP_UTF8のcharにして渡せばいいんだ。
343:デフォルトの名無しさん
04/03/16 22:57
ThrowNewのchar*が食えるのは、なるたけメモリを確保せずにthrowするための
緊急回避なんじゃねえかなあ。
344:デフォルトの名無しさん
04/04/07 10:37
Java側 → Win32dllは、JNIにて実現できる通信ですが、
Win32exe(プロセス) → Java側を実現するには、どのような手段が一番いいですかね?
アプリケーション間通信だけできればいいので、できればあまり大げさにはしたくないです。
Win32間でないからパイプは無理だし、一つのOS上での通信なのでソケット通信は少々大げさかなと。
345:デフォルトの名無しさん
04/04/07 10:38
>>344
>Win32間でないからパイプは無理
嘘だろ?
346:デフォルトの名無しさん
04/04/07 11:06
>>345
Javaでパイプ使えるか?
347:デフォルトの名無しさん
04/04/07 11:12
Win32API中のパイプ関連のAPIを全てJNIでラップしたら
使えるんでないの?
348:デフォルトの名無しさん
04/04/07 14:32
>>345 Javaでパイプは使えるよ。
349:デフォルトの名無しさん
04/04/07 15:03
>>348
それって、Javaのスレッド間通信のためのパイプであって、Win32-Java間のパイプではないんでないの?
350:デフォルトの名無しさん
04/04/07 15:20
>>348
それって NIO の Pipe の事いってんの?
個人的には >>347 で NIO の Pipe 実装するのが良いかと。
351:デフォルトの名無しさん
04/04/07 16:16
>>349 パイプって標準入出力みたいにOSが提供する入出力だろ。名前付きでも、名前無しでも。
352:デフォルトの名無しさん
04/04/07 16:27
>>351
OSが提供する入出力を、Javaは間接的にしか利用できないから、
それを使ってWin32とは対話できないのでは。
353:デフォルトの名無しさん
04/04/07 23:02
win32の中でJVMを生成する、ってのはダメなの?
354:デフォルトの名無しさん
04/04/07 23:52
> 一つのOS上での通信なのでソケット通信は少々大げさかなと。
これが一番やりやすいと思う。
355:デフォルトの名無しさん
04/06/04 21:22
SWIGの日本語ページってどうなったか誰か知りませんか?
URLリンク(swig-jp.dyndns.org)
ちなみに本家URLリンク(www.swig.org)
356:デフォルトの名無しさん
04/06/06 00:04
おまえら、SolarisとLinuxプラットフォーム以外の環境で、
native内でシグナルハンドラ使うんじゃねーぞ。
357:デフォルトの名無しさん
04/06/06 00:40
native内でC++例外使うとcatchしているにもかかわらず落ちるバグは
直ったんですかね?(linux)
358:
04/06/30 11:18
パッケージを使ったJNIで質問です。
C:\home\javaにhoge.javaを置いてコンパイル
hoge.javaはパッケージfooに置くことにする
ここまでで hoge.java ->C:\home\java
hoge.class->C:\home\java\foo
javah -jni foo.hogeでヘッダファイル作成。
foo_hoge.hを元にしてfoo_hoge.cppを作成。
リンクしてhoge.DLLを作成
ここまでで foo_hoge.h, foo_hoge.cpp -> C:\home\java
hoge.dll -> C:\home\java\foo
この後、C:\home\javaからjava foo.hogeを実行すると
UnsatisfiedLinkError例外が発生してしまいます。
hoge.java内のSystem.loadLibrary("hoge")で
エラーが発生しているとコンパイラは怒ってますが原因がわかりません
識者の方々、アドバイスお願いします。
359:デフォルトの名無しさん
04/06/30 11:29
>>358
dll の置き場所が悪い。
360:358
04/06/30 11:41
dllファイルを*.javaファイルと同じ場所に置いたら上手く動作しました。
てっきり*.classファイルと同じ場所に置くものと勘違いしてました。
>>359様、ありがとうございました。
361:デフォルトの名無しさん
04/08/12 01:04
「-> か ->* の左には構造体のポインタが必要」
nativeのソース(C言語)をコンパイルすると上のようなエラーが出るのですがなぜですか?
エラーが出ている箇所は以下の文です。
return env->NewStringUTF("Hello World");
インクルードパスはきちんと追加しています。
javahで作成したヘッダもインクルードしています。
362:デフォルトの名無しさん
04/08/12 07:05
JNIのこと知らんが、こうしてみたら?
return NewStringUTF(env, "Hello Wrold");
363:デフォルトの名無しさん
04/08/12 07:19
C と C++ じゃ JNI の呼び出し方が違う。C だと
return (*env)->NewStringUTF(env, "Hello World");
としなければいけないはず。
364:361
04/08/13 01:14
ありがとうございます。解決しました。
もう一つ質問があるのですが、java側で用意したint型の二次元配列にnative側から値を入れる方法がわかりません。
色々とやってみたんですが、実行時にエラーが出てしまいます。
365:デフォルトの名無しさん
04/08/13 01:20
エラー?
366:361
04/08/13 04:58
/*JAVA側のソース*/
public class HelloJNI{
public static native void JNITest(int intAry[][]);
static{System.loadLibrary("HelloJNI");}
public static void main(String args[]){
int intAry[][] = new int[64][64];
for(int i=0; i<12;i++){
for(int j=0; j<16;j++){
intAry[i][j] = 0;
}
}
JNITest(intAry);
for(int i=0;i<12;i++){
for(int j=0;j<16;j++){
System.out.print(intAry[i][j]+" ");
}
}
System.out.println("--------------------------");
}
}
367:361
04/08/13 04:59
/*native側のソース*/
#include <stdio.h>
#include "HelloJNI.h"
JNIEXPORT void JNICALL Java_HelloJNI_JNITest
(JNIEnv *env, jclass clazz, jobjectArray jobjArray){
int i, j;
int c=0;
jobject **array = (*env)->GetObjectArrayElement(env, jobjArray, NULL);
for(i = 0; i<12;i++){
for(j=0;j<16;j++){
array[i][j] = c;
c++;
}
}
(*env)->ReleaseIntArrayElements(env, jobjArray, array,0);
}
368:361
04/08/13 05:03
intAryに0,1,2,3,4,…
というふうに値を入れたいのですが、どうすればいいですか?
369:デフォルトの名無しさん
04/08/13 10:19
>>367
試してないので間違ってるかもしれんが こんな感じにしないとダメじゃないか?
for(i = 0; i < (*env)->GetArrayLength(env, jobjArray); i++){
jintArray jintarray = (jintArray)(*env)->GetObjectArrayElement(env, jobjArray);
jint *jint = (*env)->GetIntArrayElements(env, jintarray, NULL);
for(j = 0 ; j < (*env)->GetArrayLength(env, jintarray); j++){
jint[j] = c++;
}
(*env)->ReleaseIntArrayElements(env, jintarray, 0);
}
370:デフォルトの名無しさん
04/08/13 21:53
#ifdef __cplusplus
#define ENV (*env)
#else
#define ENV env
#endif
ENV->GetArrayLength(env, array);
371:デフォルトの名無しさん
04/08/17 14:31
>>370
それC++じゃコンパイル通らんだろ。
372:デフォルトの名無しさん
04/10/14 01:11:03
>>370
逆じゃないの?
373:デフォルトの名無しさん
04/10/14 02:56:47
逆ではあるが、それを正したところでC++じゃだめだし。
374:デフォルトの名無しさん
04/12/09 00:41:58
JNIでdefineClassメソッドを使ってbyte配列から取得したクラス情報を元に、インスタンスって生成できますか?
それにしても、JNIのDefineClassってどうやって使うんだろう・・。
375:デフォルトの名無しさん
04/12/09 00:48:26
DefineClassってJNIじゃないだろ
376:374
04/12/09 00:55:46
>>375
クラス操作 DefineClass
jclass DefineClass(JNIEnv *env, jobject loader, const jbyte *buf, jsize bufLen);
raw クラスデータのバッファからクラスをロードします。
パラメータ:
env: JNI インタフェースポインタ
loader: 定義されたクラスに割り当てられるクラスローダ
buf: .classファイルデータを含むバッファ
bufLen: バッファ長
戻り値: クラスオブジェクトを返します。エラーが発生した場合は null を返します。
URLリンク(java.sun.com)
377:デフォルトの名無しさん
04/12/09 01:17:16
いや、それやりたいのならJNI必要ないだろうという意味だ
コアAPIでできるんだから
378:374
04/12/09 07:48:29
>>377
それをネイティブコードでかけるかという質問なんです。
379:デフォルトの名無しさん
04/12/09 08:06:41
>>378
書けるだろ。
JNIじゃなくてJavaのクラスファイルに関する知識が必要になるだけで。
380:デフォルトの名無しさん
04/12/09 13:37:48
>>374がどういった場面でこれを使おうとしているのかわからない・・・
381:374
04/12/09 21:56:27
>>379
Javaオンリーでは実装したことあるのですが、
JNIに移植したとたんセキュリティエラーになりませんか?
382:デフォルトの名無しさん
04/12/09 22:58:25
あふぉぅな質問するけどよ
JNIって何て読むの??
ジニ??
ジェイエヌアイ
読めなくて"Java Native Interface "って読んでまつ。。
383:デフォルトの名無しさん
04/12/09 22:59:57
IT用語辞典 e-Words : JNIとは 【Java Native Interface】 ─ 意味・解説
URLリンク(e-words.jp)
384:デフォルトの名無しさん
04/12/11 12:30:12
>>379
書いてみて。
385:デフォルトの名無しさん
04/12/11 12:32:09
書いてみた。
386:デフォルトの名無しさん
04/12/11 12:52:25
>>385
ん?どこに?
387:デフォルトの名無しさん
04/12/13 13:46:25
.netのC#で作った.dllファイルでJNIってできませんか?
388:デフォルトの名無しさん
04/12/13 18:49:12
>>387
それを言うなら
#NI(シャープニー)だろ?
グぐれ
389:デフォルトの名無しさん
04/12/14 03:15:20
>>387
.netのC#で作った.dllファイルのメソッドを呼ぶdllを作ればいい
390:デフォルトの名無しさん
04/12/18 21:10:34
>>376
JNIインタフェースのDefineClassって、
バージョン毎にシグネチャが異なるのか?
それともヘルプが間違ってるだけなのか?
あと使い方誰か教えてくれ。
何度やってもネイティブコード上でうまくインスタンスを取得できない。
391:デフォルトの名無しさん
04/12/18 21:48:44
URLリンク(www.atmarkit.co.jp)
392:デフォルトの名無しさん
04/12/18 22:24:33
>>391
……上手くいかない理由がわかったような気がする。
393:390
04/12/18 23:04:05
>>392
教えてくれ!
何が原因なんだ。
つーか、仕様上無理なのか?
394:デフォルトの名無しさん
04/12/18 23:08:43
つーか、バイトコードを暗号化しても、すぐにやぶられるって。
395:デフォルトの名無しさん
04/12/18 23:10:13
>>394
>>390 がやっても、ってんなら同意。
396:デフォルトの名無しさん
04/12/19 13:04:15
どうせVMが実行するときにデコードしてるんだからいみないな
397:390
04/12/19 13:40:24
>>394
>>395
>>396
そこからクラスファイルを生成し、ソース入手可と言っている?
398:デフォルトの名無しさん
04/12/19 15:41:10
> そこからクラスファイルを生成し、ソース入手可と言っている?
可能。
せいぜい>390がいくら頑張っても、Jad使ってお手軽一発変換、ってのを防ぐ程度の
ことしかできんだろう。
399:デフォルトの名無しさん
04/12/19 16:02:26
そういうこと
苦労してJNIでクラスローダ作ったところでいくらでもいじられるんだし
JNIのコードだってスタックサイズの制限とかで大きいの作れないんだから
余裕で解析されるだろうな
それくらいなら帯域とかあるだろうがURLクラスローダを継承して通信を暗号化、
毎回ロードするほうがまだ現実的
ネトゲとかでいくらネイティブコードでもbotとかツールとかなくせないわけだしね
安全性のためにJNIってのは意味ない
400:デフォルトの名無しさん
04/12/20 00:03:00
>>399
> それくらいなら帯域とかあるだろうがURLクラスローダを継承して通信を暗号化、
> 毎回ロードするほうがまだ現実的
「まだ現実的」ってのがどういうことを意図しているのかよくわからんが、
JNIでクラスローダ作るのって大した手間じゃないし
ネットワークを意識しなきゃならんほうがいろいろ面倒だと思うがね。
401:390
04/12/20 00:21:26
>>399
> それくらいなら帯域とかあるだろうがURLクラスローダを継承して通信を暗号化、
> 毎回ロードするほうがまだ現実的
それこそURLクラスローダクラスをリバースコンパイルされるので、無意味のような気が・・・。
データの暗号化で無く、データを扱うモジュールの暗号化をここでは問題視しているんです。
>>400
>JNIでクラスローダ作るのって大した手間じゃないし
おお!本当ですか?
是非是非ソースレベルで教えてください。
先ほどちょっと妥協して試してみたんですが、
FileInputStreamをJNIで実装しようとしたんですが、
これもやはりうまくいきませんでした・・。
JNI、むずいっす。
402:デフォルトの名無しさん
04/12/20 00:48:32
クラスが暗号化されようとJREの上で動くときには普通のクラスだろ
403:デフォルトの名無しさん
04/12/20 11:22:32
たぶん390はVMの中は外から絶対のぞけないと思い込んでいるに一票。
404:デフォルトの名無しさん
04/12/20 21:43:16
この辺を参考にしてから googleで検索してみろ
URLリンク(java.sun.com)
405:デフォルトの名無しさん
04/12/21 13:59:21
初歩的な質問かもしれませんが、教えてください。
JavaからJNIを利用して既存のdllにアクセスする場合、オススメの方法はあるでしょうか?
何通りかあるのかもしれませんが...。
「既存のdllは一切変更しない」ことが条件です。
たとえば、間にラッパー(?)をかますとして
「dllを指定し、利用するAPIを選択すると自動でラッパー(またはそのベース部分)を生成してくれるツール」とか...。
Java以外の言語にも精通し、JNIゴリゴリが得意な方は不要かもしれませんが、
「JavaからJNIを利用して既存のdllにアクセスする」を目的とする場合、需要があると思うのですが?
よろしくお願いします。
406:デフォルトの名無しさん
04/12/21 16:15:32
ラッパーつくるしかないよ
大概符号つきをどうするかとかその辺があるわけで
407:デフォルトの名無しさん
04/12/23 18:18:03
質問ですが、一般的にJNIといった場合、JVMTI,JVMPI,JVMDI等はその中に含まれると考えていいのでしょうか?
408:デフォルトの名無しさん
04/12/23 19:17:20
それらすべてともちがうかと
JNIといった場合はネイティブコードを呼び出す、もしくはネイティブコードからJVMを呼び出すのが目的だから
ってすべて検索すれば詳細出てくるんだが釣り?
409:デフォルトの名無しさん
05/02/10 02:40:02
知恵を貸して下さい.
現在CからJavaを呼び出すコードを書いています.
Javaのコードを呼び出す度にJVMを生成するのはコストが大きいと思われるで,
改善したいと思っていますが良い方法が分かりません.
現在のコードを抽象化して以下に示します.
int main(void){ for(int i=0;i<500;i++){ hoge(); } return 0; }
void hoge(void)
{
...
JNI_GetDefaultJavaVMInitArgs...
JNI_CreateJavaVM...
env->CallStaticVoidMethod...
jvm->DestroyJavaVM...
...
}
public class HelloVM { static void hello() { System.out.println("HelloVM(Java) executed.\n"); } }
現在は上記の様な感じで,500回helloメソッドを呼ぶ度にJVMを作成しています.
しかしこれでは作成に失敗することが多々あります.
もっと良い方法はないでしょうか?
410:デフォルトの名無しさん
05/02/10 03:04:34
> 失敗する
どのような失敗
411:409
05/02/11 03:38:07
>>410
2回目以降の JNI_CreateJavaVM が失敗しているって感じです.
今は手元にコードがないので,後日詳細な報告をします.
412:409
05/02/12 06:25:57
>>410
例えば下記のサイトのコードを流用したとします.
URLリンク(www.ki.rim.or.jp)
public class HelloVM { static void hello() { System.out.println("HelloVM(Java) executed.\n");} }
#include "stdafx.h"
#include "jni.h"
int hoge(void)
{
// 前略
nResult = JNI_GetDefaultJavaVMInitArgs(&vm_args);
if ( nResult == 0 ) { printf("Success to JNI_GetDefaultJavaVMInitArgs vm.\n");}
else { printf("Fail to JNI_GetDefaultJavaVMInitArgs vm.\n"); }
// 中略
nResult = JNI_CreateJavaVM(&jvm, (void**)&env, &vm_args);
if ( nResult == 0 ) { printf("Success to create vm.\n"); }
else { printf("Fail to create vm. [%ld]\n", nResult); return 0; }
// 後略
return 0;
}
int main(void){ for(int i=0;i<3;i++){ hoge(); } return0; }
こんな感じのコードを実行すると,ループの初回は HelloVM(Java) executed. が出力されます.
しかしループの2回目は Fail to create vm. が出力されます.
このことからJVMの作成に失敗したと考えました.
# 当然ですが上記のようなループを含まないJNIのプログラムは正常に動作します.
現在は AttachCurrentThread と DetachCurrentThread が,
関連するのではないかと思っているのですが間違っていますでしょうか.
413:デフォルトの名無しさん
05/02/12 09:51:15
エラーコード・・・
414:デフォルトの名無しさん
05/02/12 14:03:45
>>412
エラーコードを出し惜しみするのは宗教上の理由か?もう答える気なくした。
415:409
05/02/12 15:59:55
あーすいませんorz
エラーコードは -1 が返ってきているのですが jni.h で確認したところ
JNI_ERR (-1) /* unknown error */
ってことは…原因は何なんでしょ.
416:デフォルトの名無しさん
05/02/13 23:58:42
DLLからJavaのメソッドって呼べる?
417:デフォルトの名無しさん
05/02/14 00:30:03
超呼べる。呼びまくり。
418:デフォルトの名無しさん
05/02/14 02:40:44
>>417
おぉJNIって凄いんだ
それってDLLの中でJVMを作成して?
それともよくあるサンプルみたいにコールバックでって意味で?
419:デフォルトの名無しさん
05/02/14 09:23:52
どっちがやりたいん?
ほとんどの場合はnative methodの実装ですむはずだけど・・・
420:デフォルトの名無しさん
05/02/14 11:04:52
どっちて言いますか…
EXE→DLL→Javaのメソッドって感じにしたいんです
それで普通にEXEからJavaのメソッドを呼ぶ方法は分かるんです
でもDLLの中でJVMを作成して呼ぶ方法を試していて失敗してるんです
ClassFindって関数で失敗してるんで、クラスパスの設定あたりかもしれないんですけどorz
それで>>418の質問をしたんです
どうかDLLの中でJVMを作成して、そこからJavaを呼ぶ方法を教えてください
421:デフォルトの名無しさん
05/02/14 19:30:01
え、ClassFindのエラーの原因を調べればいいんじゃないの
422:デフォルトの名無しさん
05/02/22 19:48:43
面白そうなことやってるな
423:デフォルトの名無しさん
05/06/17 17:21:30
NIOっていうかDirectByteBufferを駆使しようぜ
424:デフォルトの名無しさん
05/06/19 13:16:52
jarファイルをexeに変換するexewrapというツールがある。
これソースを公開してる。JNI使ってVM作ったり、
exe埋め込みリソースからクラスを生成しているようなので
参考になるかもしれんよ。
425:デフォルトの名無しさん
05/06/19 13:45:58
DirectByteBufferってアレだな
X11のshm拡張に似たものがあるな
単なるバイト列をやり取りする需要ってどんなもんだろう
画像とかか?
426:デフォルトの名無しさん
05/06/19 14:31:18
でもデスクトップ上で扱うタイプなら単純なバイト列というより
BufferedImageとかで扱うことが多いもんだから
shortやint型配列とかのほうがオーバーヘッドもないし便利
427:デフォルトの名無しさん
05/07/06 23:21:04
LinuxでJNIで何か処理をすると、StackOverflowErrorが発生するのですが、
何か情報ないでしょうか?
428:デフォルトの名無しさん
05/07/06 23:58:15
Windowsでも同じく発生するよ
スタックはかなり小さくないと動かない模様
Java自体のソースコードを修正してコンパイルしなおしが必要
429:デフォルトの名無しさん
05/07/07 00:06:36
>>425
ByteBufferからIntBufferやShortBufferに変換できるから無問題
430:デフォルトの名無しさん
05/07/07 00:20:21
>>428
Windowsで同じソース(ネイティブコードは除く。ただし、処理内容は同じ)を走らせても
StackOverflowError は発生しないのにLinuxでは発生してしまいます。
何が原因なのか調べる手段だけでもアドバイスもらえないでしょうか?
431:デフォルトの名無しさん
05/07/07 00:48:35
スタックサイズを指定すればいいんでないかのぉ?
URLリンク(66.102.7.104)
432:デフォルトの名無しさん
05/07/07 00:57:08
残念ながらJNIのスタックサイズは有効にならないよ
433:デフォルトの名無しさん
05/07/07 00:58:14
>>430
Java自体のコンパイルってのはVMのことね
J2SE5.0の新しいライセンスでダウンロードしてコンパイルしなおすしかない
434:デフォルトの名無しさん
05/07/07 20:52:39
>>433
残念ながら、アプリの配布をVMと一緒にという訳にはいかないので
何か違う方法を探してみます。
ちなみに、JNIに関わりの無いところでは、相当量のスタックを使ってもオーバーフローしていません。
435:デフォルトの名無しさん
05/07/07 21:06:17
>>434
当たり前
Javaのスタックとはまったく別物だし
436:デフォルトの名無しさん
05/07/08 00:21:16
原因が分かりました。
ネイティブ側のメモリリークに、ガーベッジが重なったときにVMがアボートしていました。
どうりで特定の場所で落ちない訳です。
StackOverflowErrorはVMが異常な状態のときにスローされていたので、
恐らく関数ポインタがズレたせいだと思います。
437:デフォルトの名無しさん
05/10/02 14:10:30
>>425
亀レスやけど、
DDAとか、memory mapped I/Oとか、
特に組み込みでVRAMなんかに使うんでしょ。
438:デフォルトの名無しさん
05/10/04 15:07:02
DLL から JNI を呼ぶ場合、DestroyJavaVM()は、他にJavaVMを使用中の
スレッドが存在すると JavaVM がアンロードできないみたい。
(DestroyJavaVM() で終了まちになる・・・)
強制的に DestroyJavaVM() でJavaVMをアンロードする方法ってあるの?
439:デフォルトの名無しさん
05/10/04 17:07:35
えーと、マルチスレッドプログラミングの基本なんですが、
スレッドは、各々自分の責任において、終了処理を行うべきです。
// Thread.stop()がdeprecatedであるのと同じ理由。
ですから、JVM内できちんとThreadの終了を行うのが正当なやり方です。
どうしても強制的に終了したければ、
JVMのなかでdeprecatedなThread.stop()を矯正終了用のmethodで使ってみてください。
URLリンク(java.sun.com)
440:デフォルトの名無しさん
05/12/19 19:39:34
Cで作ったクラスインスタンスや構造体をJavaに渡すことは可能?
Javaで使えなくても、次のDLLの関数呼びに使うために
441:デフォルトの名無しさん
05/12/21 09:03:27
long値にポインタつっこもうぜ
442:デフォルトの名無しさん
05/12/21 20:11:40
それでDLL側で作ったメモリの領域が保たれるのか。
CとJava別個に考えてたけど、普通に使えるのね。
やってみる。
443:デフォルトの名無しさん
05/12/21 23:30:29
保たれはせんだろ。単なるポインタだし。
444:ハーピィ
05/12/24 01:08:28
E・∇・ヨノシ <444ゲット♫
445:デフォルトの名無しさん
06/02/15 11:09:40
消えちゃ勿体ないのでageちゃいます
446:デフォ
06/03/18 14:47:41
ふんとだもっだいね。
447:デフォルトの名無しさん
06/03/24 11:41:57
Bufferクラスって
JNIで実装されてるんだよね
448:デフォルトの名無しさん
06/03/27 14:03:54
外部メモリを取るやつがあるからな
449:デフォルトの名無しさん
06/04/09 08:02:11
void getValues(long &x, long &y);
のような関数をJNIで呼びたいのですが、
それにはx, y をメンバーに持つオブジェクトを使う
しかないのでしょうか?
450:デフォルトの名無しさん
06/04/09 21:19:38
そう。
あとその質問にJNIは関係ない。
451:デフォルトの名無しさん
06/04/15 16:32:50
cygwin環境でjava動かしてるんだけど.soって読み込む方法ってあるかな?
452:デフォルトの名無しさん
06/04/17 08:22:40
Windows XP SP2
Java 2 SDK 5
JavaからDLL内のCの関数呼び出して、さらにそのCの関数の中から
Javaのメソッド呼び出すことはできるんだけど、
CからJNI_CreateVMで直接Java VMを生成しようとすると失敗します。
上記の環境に加えてjvm.dllにパスが通っているだけではだめなんでしょうか?
JNI_CreateVMの戻り値は-1です。
453:デフォルトの名無しさん
06/04/17 10:08:07
すみません、JNI_CreateJavaVM の間違いでした。
JREをインスコすると C:\Windows\java.exe が
インストールされるので、Java プログラムを
実行している分にはパスのことを気にしなくてもいいんですが、
JNI でごりごり遊ぶにはいろいろとパスを通さなくては
なりませんか?面倒なのでネイティブプログラムと
同じディレクトリに jvm.dll をコピーしてるんですが。
454:デフォルトの名無しさん
06/04/17 13:20:39
> 同じディレクトリに jvm.dll をコピーしてるんですが。
これが原因と見た。
455:デフォルトの名無しさん
06/04/17 13:26:35
>>454 やっぱそうですか・・・
Windows で JNI で遊んでる皆さん、
よかったらJava関連ではどこにPATHを通してるか、
さらしてもらえませんか??
>>452 のように Java アプリから呼び出した
C の関数から、さらに Java のメソッドを
コールバックさせることはできているので、
まったく何もかもがうまくいっていない、
というわけじゃないと思うんです。
456:デフォルトの名無しさん
06/04/17 15:09:26
息長ぇなこのスレ。
457:デフォルトの名無しさん
06/04/18 00:04:55
Java Forums - can't create java vm ... setting path for jvm.dll
URLリンク(forum.java.sun.com)
この辺も眺めながらもういっぺんトライしてみます。
458:デフォルトの名無しさん
06/04/19 02:48:31
質問です。
Java 5から導入されたアノテーション情報(特にクラスに埋め込んであるタイプのもの)に、
JNIからアクセスできるのでしょうか。
SunのサイトにJNI 5.0とかいうのがあったので見てたのですが、それらしいものは見つかり
ませんでした。どんなものでしょうか。
459:デフォルトの名無しさん
06/04/19 08:33:43
JAVAからJVMのメリットをなくしたらデメリットしか残らない
460:デフォルトの名無しさん
06/05/22 09:43:09
JNIでネイティブのDLLを呼び出すJAVAアプリ作ったんだけど、
JARファイルにまとめると動いてくれないよ。(エラーも出ずに何も反応無く終了する)
JARファイル中のDLLを読み込むにはloadLibraryかloadじゃなくて
findLibraryかなにかで読み込めば良いの?
461:デフォルトの名無しさん
06/05/22 10:00:30
>>460
標準のJNIのローダーはjarに対応してたっけ?
ネイティブのファイルシステムに置いて無いとダメじゃないのか?
462:460
06/05/22 14:03:16
>>461
即レスあんがと。
レス424のexewrapを使ってGUIでexeにしてみると
java.lang.UnsatisfiedLinkError: no dllname in java.library.path
at java.lang.ClassLoader.loadLibrary(Unknown Source)
at java.lang.Runtime.loadLibrary0(Unknown Source)
at java.lang.System.loadLibrary(Unknown Source)
以下略
ってエラーログ出てたのでDLL読めてないみたいです。
試しに、DLLを含めずにJAR作って、別途フルパス指定でHDD上のDLLをloadすると
動きました。
463:デフォルトの名無しさん
06/05/22 14:44:43
DLLはJavaの仕組みではなくWindowsの仕組みだからな。
464:デフォルトの名無しさん
06/06/27 09:56:25
>>462
URLリンク(www-06.ibm.com)
465:デフォルトの名無しさん
06/07/04 21:18:40
時給1000円でJava教えてくださるかたを募集します
場所 所沢(池袋・高田馬場から直通)
i-want-to-study-java@hotmail.co.jp
(アドレスは全角で書いてあるので半角に直してください)
よろしくおねがいします
466:デフォルトの名無しさん
06/07/05 02:21:36
コンビニのバイトより安いですが、よろしくお願いします。
467:デフォルトの名無しさん
06/07/05 21:37:03
もち交通費別だよな
468:デフォルトの名無しさん
06/07/05 23:55:10
値段交渉したら、時給上げてくれた
469:デフォルトの名無しさん
06/07/12 10:54:51
はじめまして,今までJavaしか触ったことがなかったのですが,
470:469
06/07/12 11:11:20
すみません,間違えてエンター押しちゃいました;;
Win32APIを使う必要があり,JNIにを使い始めたものです.
C++側でから渡されたString型の引数はjchar型として扱うようなのですが,
jchar→WCHARの変換はどのようにすればよいのでしょうか?
const WCHAR *Uni = env->GetStringChars(jstring, NULL);
のようにすれば普通にWCHAR形式として取り込めると書いているページも
あったのですが,こちらの環境では
> 'const jchar' から 'const WCHAR *' に変換できません。
とエラーがでます.
URLリンク(www.ki.rim.or.jp)
を参考にして,せめてWideCharToMultiByteを使ってSHIFT_JISに変換しようとしても,
>'WideCharToMultiByte' : 3 番目の引数を 'const jchar *' から 'LPCWSTR' に変換できません。
とエラーがでます.
どのようにすればjchar→WCHARの変換ができるのでしょうか?
当方の環境は
Java
jdk 1.5.0_06
Eclipse 3.1(Java5でコンパイル)
c++
VC++2005 Express
です.
471:デフォルトの名無しさん
06/07/12 13:09:44
CHAR *GetStringFromJstring(JNIEnv *env, jstring jstr)
{
CHAR *sjisCode = 0;
INT32ret = 0;
const jchar *jchr = 0;
INT32jlen = 0;
// jstringがNULLではないときのみ処理を行う
if(jstr != NULL)
{
// 文字列、文字長の取得
jchr = env->GetStringChars(jstr, NULL);
jlen = env->GetStringLength(jstr);
// バッファの確保(すべて2バイト文字だった場合を想定)
sjisCode = (CHAR *)malloc(jlen * 2 + 1);
if (sjisCode != NULL)
{// メモリ確保成功
memset(sjisCode, 0, (jlen * 2 + 1));
// コード変換
ret = WideCharToMultiByte(CP_ACP, 0, jchr, jlen, sjisCode, jlen * 2 + 1, NULL, NULL);
sjisCode[ret] = '\0';
}
// 取得文字列の開放
env->ReleaseStringChars(jstr, jchr);
}
return sjisCode;
}
472:469
06/07/12 14:15:25
>>471
ありがとうございます.早速試してみます.
また何かあったら,書き込むかもしれないのでよろしくお願いします.
473:469
06/07/12 14:25:36
>>471
連続ですみません.
>ret = WideCharToMultiByte(CP_ACP, 0, jchr, jlen, sjisCode, jlen * 2 + 1, NULL, NULL);
やはりの部分で
>3 番目の引数を 'const jchar *' から 'LPCWSTR' に変換できません。
と出てしまいます.
なにか宣言が抜けたりしているのでしょうか?
474:471
06/07/12 15:02:49
VisualStudio6.0SP6の環境では問題無くコンパイルして動作しておりましたが、
VC++2005 Expressで駄目な理由は判りかねます…。
475:471
06/07/12 15:25:57
(LPCWSTR)jchr
明示的にキャストしても駄目でしょうか?
476:469
06/07/12 21:07:20
>>475
ありがとうございます!!
無事にできました.今までずっとJavaしか触ったことがなかったのですが,
今回C++を触り始めて改めてJavaのありがたさを思い知ってます.
477:デフォルトの名無しさん
06/07/17 20:59:54
時給1000円でJava教えてくださるかたを募集します
場所 所沢(池袋・高田馬場から直通)
よろしくおねがいします
i-want-to-study-java@hotmail.co.jp
教える対象は超初心者です。
専門学校などでJavaを勉強されていて夏休みだけ教えたいという方も歓迎です
478:デフォルトの名無しさん
06/07/18 05:15:38
> 465-468
479:デフォルトの名無しさん
06/09/05 22:25:34
JNIの勉強をしているのですが,CPU使用率のように連続的にデータを取得する際,
Java側からwhileループをまわして何度もdllを読み込むという非効率な方法をとっています.
一度dllを呼び出すだけで連続的に返り値を読み取る方法はあるのでしょうか
ご教授お願いします.
480:デフォルトの名無しさん
06/09/05 22:36:18
>>479
dll読み込む、dll呼び出すってのが、具体的に何を指して言ってるのかわからん。
481:479
06/09/07 12:53:19
>>480
言葉が足りなくてすみません.
dll読み込む、dll呼び出すというのは,ネイティブメソッドを実行するという意味で書きました.
現在はネイティブメソッド実行時に,返り値としてCPU使用率を取得しているのですが,
この方法ではJava側でWhileループで何度もネイティブメソッドを実行する必要があります.
ネイティブメソッド側でWhileループをつかってJavaに連続的に値を返す方法は
ないのでしょうか
482:デフォルトの名無しさん
06/09/07 18:52:07
>>481
ネイティブ側では java.nio.ByteBuffer#allocateDirect(int) で得られるバッファに随時書き込んで
Java側はポーリングするだけ、とかならメソッド呼び出しの負荷は減るかもしらん。
ただし、取りこぼしが考えられるので完全な連続性は保証できないし
同期処理とかを考えると取り扱いはかなり面倒になるし、
同期処理は下手すりゃネイティブメソッド呼び出しよりも高くつく可能性もある。
自分の技術力とか、CPU使用率がどれだけ必要なのかとかを良く考えた方が良いかも。
ま、裏技的な事をする前にネイティブメソッド呼び出しが
本当にボトルネックになってるのか検証する事をオススメするけどね。
何の検証もせずに、ネイティブメソッド呼び出しが遅いとか聞きかじった程度なら、
上記みたいな事をしても無駄だと思う。
483:デフォルトの名無しさん
06/09/10 12:57:34
>>481
dllでOSのスレッド作って、そのスレッドでjvmにアタッチして、
whileループ回しながら、適時、Listener経由でコールバック。
484:デフォルトの名無しさん
06/09/11 01:39:27
>>483
結局ネイティブ->Javaのメソッド呼び出しのコストが必要になるけどね。
485:名無しさん@お腹いっぱい。
06/12/07 15:12:29
関連wiki
URLリンク(wiki.ninki.org)
486:デフォルトの名無しさん
06/12/07 19:57:23
Cで書いたプログラム上でJVMを生成して、クラスをロードしようと思ってるんだけど、
Invocation APIでJVMを作るサンプルができたので、デバッグメッセージをファイルにだそうとしたら、セグメンテーションフォルトで落ちるようになってしまった。
いろいろ削っていって、
FILE* f;
↑この一行があるかないかだけで、セグ(ryが起きるかどうかが変わるんだが、
これどう解決したらいいだろうか?
487:デフォルトの名無しさん
06/12/07 22:19:52
Java専用のCコンパイラがあったらなとは思う。
ソースコード一式セットしておけば
Antみたいのが走ってそのOS向けにビルドとか。
dllとかいちいち作らせるのも忍びない
488:デフォルトの名無しさん
07/04/22 23:55:47
489:デフォルトの名無しさん
07/05/26 21:11:12
Java Native Access (JNA): access native libraries with pure Java code.
URLリンク(jna.dev.java.net)
JNative, Java framework for DLL access for Windows and Linux
URLリンク(jnative.free.fr)
nlink: NLink - Native Library Linker:
URLリンク(nlink.dev.java.net)
490:デフォルトの名無しさん
07/05/26 22:56:51
JNIと何が違うの?
491:デフォルトの名無しさん
07/05/26 22:58:03
>>490
自分で一切ネイティブコード書かなくて良い点が違うんでは?