[表示 : 全て 最新50 1-99 101- 201- 301- 401- 501- 601- 2chのread.cgiへ]
Update time : 05/10 00:48 / Filesize : 168 KB / Number-of Response : 668
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

★お前らJavaはJNIで組もうぜ★



1 名前:chinkasu [02/10/05 14:27]
このすれ立てても一人としてレスはいるとはおもっちゃ
ねーけどさ
2ちゃんのアフォにはこのレス荒らすことぐらいしかできないと
思ってるぜ
お前らに期待を裏切るような書き込みをリクエストする


76 名前:デフォルトの名無しさん [02/12/26 22:32]
JNDIって知ってる?

77 名前:デフォルトの名無しさん mailto:sage [02/12/26 22:35]
>>76
java.sun.com/j2se/1.4/ja/docs/ja/guide/jndi/
コレっすか? でもコレ JNI と関係ないよね。

78 名前:デフォルトの名無しさん mailto:sage [02/12/26 22:45]
>>75
ドキュメントによると

>L fully-qualified-class ; 完全指定のクラス

だそうだ。

79 名前:デフォルトの名無しさん mailto:sage [02/12/26 23:01]
例えば "Ljava/lang/String;" とかやるみたい、たぶん。

80 名前:Java軍曹 [02/12/27 04:18]
まず普通に一本Javaアプリこしらえて、それをその後、ガッツンガッツンのキッリキリに
JNIに置き換えて...というか全て中身DLLに挿げ替えて、最終的に static void mainと、
そこから連なる一連のメソッドのインタフェースだけをJavaとして残す。
つーか、エントリ以外ほぼ全てnative宣言。
....っていう強姦まがいのコードが書きたい。いや、むしろ一度書いてみたい。

write once , run here only.

81 名前:Java軍曹 [02/12/27 04:23]
ちなみに、当然DLL内ではバージョンの限定されたMFCランタイムや、
何かをインストールしていないと絶対にインストールされないCOMを
ギュゥオンギュゥオンに使用。

write once , run now.

82 名前:デフォルトの名無しさん mailto:sage [02/12/27 04:25]
write once, debug anywhere

83 名前:デフォルトの名無しさん mailto:sage [02/12/27 04:54]
>>80
>最終的に static void mainと
…。
やりたきゃやれば?
GC とか名前による動的バインディングとかの恩恵を
全部 omit するなら Java でやる必要ないし。

84 名前:Java軍曹 [02/12/27 05:12]
>>83
御意!! まさにおっしゃる通りィッ!!
というより、すでにJavaで無しッッッ!!



85 名前:デフォルトの名無しさん mailto:sage [02/12/27 05:17]
>>80
それだったら C言語 のソースをJavaのバイトコードに落とせるコンパイラとか書いた方が面白そう。

86 名前:Java軍曹 [02/12/27 05:23]
>>85
素晴らしいィィッ!! 隊長ッ!!
全ッ然意味の無いシロモノだが、イイッ!

自分、書いてみたいでありますッ! でも仕事量がマジ半端無ェ勢いに
なりそうで、寝小便しそうでありますッ!

87 名前:デフォルトの名無しさん mailto:sage [02/12/27 06:59]
ふつうにCやらC++で書いて、それを、main()だけをエクスポートするdllにして、
javaのmainからキックすればええやん。

88 名前:Java軍曹 [02/12/27 08:20]
>>87
(゚听 )ツマンネ

89 名前:Java軍曹 [02/12/28 01:07]
>>88 ← 彼は自分では無いでありますッッ!!
でも、それではつまんないという事には禿げて同意でありますッッ!!


90 名前:デフォルトの名無しさん mailto:sage [02/12/28 01:08]
>>87
っつーか Runtime.exec() で(以下略)
素直にネイティブアプリに(以下略)

91 名前:デフォルトの名無しさん [02/12/28 01:13]
>>90
Runtime.exec()には胴衣ですが、
Javaアプリケーションのプラグインとしてネイティブアプリ
ケーションをコールするっていうのは、あるのかもね。

92 名前:デフォルトの名無しさん mailto:sage [02/12/28 01:15]
anywhereでrunしないけどね。

93 名前:デフォルトの名無しさん mailto:sage [02/12/28 01:16]
そんなに、まともなソフトつくりたいんならさ、きっぱりJava捨てたら?

94 名前:デフォルトの名無しさん mailto:sage [02/12/28 01:17]
>>93
Java捨てて 何使ったら良いでしょうか?



95 名前:デフォルトの名無しさん [02/12/28 01:20]
>>92
JNIを使うという前提での話にそういう突っ込みしますか…

96 名前:デフォルトの名無しさん mailto:sage [02/12/28 01:27]
>>95
JNI使う != run anywhere じゃないような。
Java の標準ライブラリだって JNI 使ってんだし。

97 名前:デフォルトの名無しさん [02/12/28 01:28]
>>93
チャンポンしろ。
なんでもつかえ。
いいとこどり。


98 名前:デフォルトの名無しさん mailto:sage [02/12/28 01:28]
>>94
C#使ったらどうだ?
それでもしJavaと同じように糞だとわかったら、
その頃には次の言語が出てるから、新言語に乗り換えろ。

99 名前:デフォルトの名無しさん mailto:sage [02/12/28 01:29]
>>98
それって延々と糞言語使い続けるって選択肢ですか?

100 名前:デフォルトの名無しさん [02/12/28 01:31]
>>96
どんなボケですか?
ユーザが勝手に作るJNI!=Run Anywhereは常に成立デスヨ。

101 名前:デフォルトの名無しさん mailto:age [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 名前:デフォルトの名無しさん mailto:sage [02/12/28 01:39]
>>101
C言語ソース -> Javaソース じゃなくて
C言語ソース -> Javaバイトコード だったら出来るんじゃない?

それに C言語ソース -> Javaソース だったら
可変長引数の処理とかも無理っぽいし。



105 名前:デフォルトの名無しさん mailto:sage [02/12/28 01:50]
Cをアセンブリやマシン語には出来ても
アセンブリやマシン語をCには出来んでしょ。
Java厨にはそんなこともわからんの?

106 名前:デフォルトの名無しさん mailto:sage [02/12/28 01:53]
>>105
つまり、君には理解できなかったと。

107 名前:デフォルトの名無しさん mailto:sage [02/12/28 02:11]
>>106 わけわからん

108 名前:デフォルトの名無しさん mailto:sage [02/12/28 02:22]
>>105
CをJavaにするコンバータを作るのは無理だけど
JavaでCをエミュレートするのは無理じゃないって事では?

109 名前:デフォルトの名無しさん mailto:sage [02/12/28 04:48]
Windowsでレジストリにアクセスしたいときに使ってた。
まあ、せいぜいインストールパスを見るぐらいだけど。
後、イベントログの出力に log4j を使ったんだが、内部
ではJNI経由でDLL呼び出ししてたな。小技的に使うのが
いい感じ。


110 名前:デフォルトの名無しさん mailto:age [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 名前:デフォルトの名無しさん mailto:sage [02/12/28 05:42]
>>110
それだったら素直に Vector 使った方が早い。

112 名前:デフォルトの名無しさん mailto:sage [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 名前:デフォルトの名無しさん mailto:sage [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 名前:デフォルトの名無しさん mailto:age [02/12/28 17:30]
>>111-113
コンストラクタで new Vectorしていなかった。
確かにnumberいらないか。

Vectorそのまま使ってもいいけど、
そこに入るのは可変長引数のみであることを意識するために
別にクラス用意した方がいいかなと思った。

あと、 >>114-115 の言うとおり、引数無しvoidにも対応させるための手段も
必要かなと。
 add()メソッドが動くまでget()するとデフォルトでvoid状態
 remove()メソッドで全部消してget()するとvoid状態を返す
な感じに。

www.gimlay.org/~javafaq/S012.html#S012-10
を見るとやっぱりクラス作った方がいいかなと。
引数のサイズの上限は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して探し出さなければならないからであります!

参考↓
ttp://java.sun.com/j2se/1.3/ja/docs/ja/guide/jni/spec/jniTOC.doc.html

121 名前:Java軍曹 [02/12/29 19:26]
簡単に言ってしまえば、「COMを使うっぽい感じ」でありますッッ!!

122 名前:デフォルトの名無しさん mailto:sage [02/12/30 03:34]
>>120
それだと今回の add を JNI 化しても遅くなる可能性のが高そうだね。

123 名前:Java軍曹 mailto:sage [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 mailto:sage [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 mailto:sage [02/12/31 20:12]
>>127の書き込み訂正
× 100M回
○ 1M回

130 名前:デフォルトの名無しさん mailto:sage [02/12/31 20:20]
>>127-129
レポートご苦労様っす。

131 名前:デフォルトの名無しさん mailto:sage [03/01/02 14:46]
>>128
GetObjectClassとGetMethodIDは一回でいいはず
なんどもやるのは無駄

132 名前:デフォルトの名無しさん mailto:sage [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 名前:デフォルトの名無しさん mailto:sage [03/01/04 11:00]
GetObjectClass/GetFieldIDは案の定重いね
どちらが重かったか分かる?

134 名前:デフォルトの名無しさん mailto:sage [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 名前:デフォルトの名無しさん mailto:sage [03/01/04 11:23]
>>133
ほい。回数は先のと同じく100M回。

invokeJNIMethod::4096ms
getObjectClass::12328ms
getFieldID::74877ms

136 名前:デフォルトの名無しさん mailto:sage [03/01/04 11:28]
>>135
グッジョブ!
100M回って、100 * 1000 * 1000 回であってるよね?

137 名前:デフォルトの名無しさん mailto:sage [03/01/04 11:35]
>>136
>100M回って、100 * 1000 * 1000 回であってるよね?
そのとーりです。

138 名前:デフォルトの名無しさん mailto:sage [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 名前:デフォルトの名無しさん mailto:sage [03/01/04 15:21]
ううむ、JIT様がガリガリ最適化したら、
どう書いても同じになりそうな気がするんだが
そうでもないのか。

140 名前:IP記録実験 mailto:IP記録実験 [03/01/08 22:23]
IP記録実験
qb.2ch.net/test/read.cgi/accuse/1042013605/

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 名前:デフォルトの名無しさん mailto:sage [03/01/09 00:42]
>>69
アクセスログじゃなくって書き込み単位で記録しているだけだろ
そんな一気にはふえねーだろ

142 名前:デフォルトの名無しさん mailto:sage [03/01/09 01:02]
ひろゆきの悲しいときを教えれ。

143 名前:デフォルトの名無しさん mailto:sage [03/01/09 01:21]
>>422
別に気にはならないですね。


144 名前:デフォルトの名無しさん mailto:sage [03/01/09 01:33]
どうですか。( ´Д⊂



145 名前:デフォルトの名無しさん mailto:sage [03/01/09 02:09]
「2chでは裏でIP記録されています。IPを抜かれたくなければ
セキュリティガードに…」

というコピペを流行らせる会 会長↓

146 名前:デフォルトの名無しさん mailto:sage [03/01/09 03:00]
さて。2ちゃんの流浪の民を吸収できる掲示板システムを作ることが出来得るなら
これは非常に大きなビジネスチャンスだと思うのだが。
誰かやれ!

147 名前:デフォルトの名無しさん mailto:sage [03/01/09 03:47]
>>197

 いや、ま、正論ではあるのだけどな。。



148 名前:デフォルトの名無しさん mailto:sage [03/01/09 18:35]
======2==C==H======================================================

         2ちゃんねるのお勧めな話題と
     ネットでの面白い出来事を配送したいと思ってます。。。

===============================読者数: 138720人 発行日:2003/1/9

年末年始ボケがそろそろ収まり始めた今日このごろのひろゆきです。

そんなわけで、年末に予告したIP記録ですが実験を開始しています。

「2ちゃんねる20030107」
こんな感じで各掲示板の最下部に日付が入ってるんですが、
20030107以降になってるところはログ記録実験中ですー。

んじゃ!

────────────────────────Age2ch─
■この書き込みは、Age2chを使って配信されています。
────────────────────────────
Keep your thread alive !
pc3.2ch.net/test/read.cgi/software/1041952901/l50
────────────────────────────

149 名前:デフォルトの名無しさん mailto:sage [03/01/10 00:20]
>>493
いくらなんでも、無差別にIP公開はしないと思うが。

150 名前:デフォルトの名無しさん mailto:sage [03/01/10 09:08]
>>573
世の中サヨとネットと圧力で出来てると思っているお前のような奴のほうが
世の中にとっては役に立たない

151 名前:デフォルトの名無しさん mailto:sage [03/01/10 10:28]
>>196
いや、そんなことはないですよ。

152 名前:デフォルトの名無しさん mailto:sage [03/01/10 11:05]
西村氏は
廃人で雪に入って凍っているかと思ったらまだ生きていたんですね。

153 名前:デフォルトの名無しさん mailto:sage [03/01/10 11:36]
ちなみに、「国民クイズ」内では日本国憲法が改正され、こんな条文が追加されてる。
日本国憲法第12章104条「国民クイズは国権の最高機関であり、その決定は
国権の最高意思最高法規として、行政、立法、司法、その他あらゆるものに絶対、
無制限に優先する」

笑えるところなのかわからんが34話にはムネオたんか?と思われる方もカメオしてる。

154 名前:デフォルトの名無しさん mailto:age [03/01/10 11:57]
Java Native Interface?



155 名前:デフォルトの名無しさん mailto:sage [03/01/10 12:24]
>>481
名誉毀損で逮捕かよ!

でも管理人、笑えないんじゃない?コレ。


156 名前:デフォルトの名無しさん mailto:sage [03/01/10 12:41]
>>434
現実のものとなりました。

157 名前:デフォルトの名無しさん mailto:sage [03/01/10 12:51]
>>942
一応ありがと。そのリンク先の1の判決文末尾の「別紙発言目録」ってのが
見たいわけなんだけど、そのスレのどっかにリンク張られてるのかな?


158 名前:デフォルトの名無しさん mailto:sage [03/01/10 15:01]
・圧縮やなんかでdat落ちした分を省いた
・報告無しで処理された分を省いた
・まとめが好きで好きでたまらないまとめ大好きっ子だった

159 名前:デフォルトの名無しさん mailto:sage [03/01/10 16:30]
あーの事ね。



大阪キタ━━━━━━┌(_Д_┌ )┐━━━━━━ !!!!!

160 名前:デフォルトの名無しさん mailto:sage [03/01/10 22:52]
お近くの警察署か裁判所へどうぞ>329さん


161 名前:デフォルトの名無しさん mailto:sage [03/01/10 22:59]
ニュー速以外はだいたい串通るから
IP記録は無駄無駄。。。

162 名前:デフォルトの名無しさん mailto:sage [03/01/11 00:15]
末期症状だな。削除問題をIP記録にすりかえてる。北朝鮮並みの姑息な対応。

163 名前:デフォルトの名無しさん mailto:sage [03/01/11 00:23]
ぼうやだからさ

164 名前:デフォルトの名無しさん mailto:sage [03/01/11 09:48]
釣りじゃないのなら実に現実味のない意見だ



165 名前:デフォルトの名無しさん mailto:sage [03/01/11 09:51]
まあよしゆきも控訴審の判決が出たからにはポーズだけでもとらにゃいかんだろう。
よほど悪質な犯罪予告等を除いてはよしゆきの判断次第。面倒くさくなったら、
当事者同士で問題解決してよん。んじゃ!って感じだろう。

166 名前:デフォルトの名無しさん mailto:sage [03/01/11 10:22]
======2==C==H======================================================

         2ちゃんねるのお勧めな話題と
     ネットでの面白い出来事を配送したいと思ってます。。。

===============================読者数: 139038人 発行日:2003/1/10

なにやら、連日メルマガだしてるひろゆきです。

そんなわけで、ログ記録実験ですが、いちいちサーバ指定するのが面倒なので、
全部のサーバに入れてみました。

重くなって落ちたりしてもご愛嬌ってことで。。。

んじゃ!

────────────────────────Age2ch─
■この書き込みは、Age2chを使って配信されています。
────────────────────────────
Keep your thread alive !
pc3.2ch.net/test/read.cgi/software/1041952901/l50
────────────────────────────

167 名前:デフォルトの名無しさん mailto:sage [03/01/11 11:16]
大作死ね!とか欠いたら危険になるのかな?

168 名前:デフォルトの名無しさん mailto:sage [03/01/11 11:47]
会同


※この書き込みはフィクションです。
 実際の団体・人物・民族等とは一切関係ありません。

169 名前:デフォルトの名無しさん mailto:sage [03/01/11 12:49]

このスレのIPとって訴訟するのだけは止めてくれよ。クチビルゲ。
aa.2ch.net/test/read.cgi/kao/1039731177/







うわっ何かクラックされて勝手に文章が・・・あ、さらにポインタが書き込みボタンに・・・あわわわ!!

170 名前:デフォルトの名無しさん mailto:sage [03/01/11 13:18]
俺もそう思う。高い金自腹で払って掲示板を運営してて
何処の誰かも知らん奴が勝手なこと書いた事によって
自分に火の粉が飛んで来たら、秘密を守ってやる義理は
ないよなひろゆきにしたら。

171 名前:デフォルトの名無しさん mailto:sage [03/01/11 16:05]
まぁなんだ

「ひろゆきよ ラウンジが重いんだが・・・と電話しまくって即閉鎖」

が一番早そうだな(藁

172 名前:デフォルトの名無しさん mailto:sage [03/01/11 16:11]
復活してちょっとうれしい今日の漏れ

173 名前:デフォルトの名無しさん mailto:sage [03/01/12 00:12]
>>IP記録

告発ネタが減少するのは残念。

・WTCテロのリーク
・西部の松坂の駐車違反
・牛肉買い上げの告発

等々、
いろいろとおいしいネタがあったのになあ。
おまえらの知ってる2ちゃん内の告発ネタを教えてください。

174 名前:デフォルトの名無しさん mailto:sage [03/01/12 00:22]
良識ある書き込みをしろ



175 名前:デフォルトの名無しさん mailto:sage [03/01/12 03:00]
はピン子のAAだったのか(w

176 名前:デフォルトの名無しさん mailto:sage [03/01/12 03:03]
国税庁のHP

177 名前:デフォルトの名無しさん mailto:sage [03/01/12 10:32]
マスコミって単純だね。
ほんと馬鹿だよな。

178 名前:デフォルトの名無しさん mailto:sage [03/01/12 10:36]
正当性を高める必要は全くないな… 知ったかぶりしていた&判決すらちゃんと読んでないな僕は。
まさか弁護士がついてるのに「本件にはプロバイダー責任法が適用され,同法の制定経緯,規制範囲等に照らすと,被告が本件各発言を削除しなかったことにつき削除義務違反はない」と主張するなんて常識的に考えられなかったので…
寝ぼけてたのかな?恥ずかしい(^^; ゴメンナサイ> 231&253

179 名前:デフォルトの名無しさん mailto:sage [03/01/12 21:12]
   /⌒ヽ 
  /  ´_ゝ`)   IP子です。よろしこ
  |    /   
  | /| |   
  // | |  
 U  .U


180 名前:デフォルトの名無しさん mailto:sage [03/01/12 21:14]
>626
・・・
デンパでしゅか?

181 名前:デフォルトの名無しさん mailto:sage [03/01/12 21:27]
いえいえ、誘導どうもありがとうございます。


182 名前:デフォルトの名無しさん mailto:sage [03/01/13 15:44]
>>139
JIT様の最適化にも癖があるよーで…

183 名前:山崎渉 mailto:(^^)sage [03/01/13 18:54]
(^^)

184 名前:山崎渉 mailto:(^^)sage [03/01/15 18:08]
(^^)



185 名前:デフォルトの名無しさん mailto:age [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 名前:デフォルトの名無しさん mailto:sage [03/01/18 10:02]
確かPATHの通ってるところ

188 名前:デフォルトの名無しさん mailto:sage [03/01/18 10:03]
>>185
> Exceptionのチェック
んなわけない

189 名前:デフォルトの名無しさん mailto:sage [03/01/18 10:15]
>>186
Windows が使用する DLL 検索パス
www.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/library/ja/vccore/html/_core_the_search_path_used_by_windows_to_locate_a_dll.asp

他にもレジストリとか見てたよーな気がするんだけど気のせいかも…

190 名前:デフォルトの名無しさん mailto:sage [03/01/18 11:34]
>>188
そうなの?FindClassとかGetMethodIDとかは戻り値が0だったら
エラーが起こってるのは判るけど、
CallObjectMethodとかだと戻り値だけじゃわかんないやん。

で、一度exceptionが起こると、続くJNI呼び出しはおかしくなるようです。
つかjava.exeが固まります(jdk1.4.1)。というわけで

env->CallIntMethod();
check();
env->CallObjectMthod();
check();
...

なんていうコードを書くハメになったりするわけですが、激しくダサい。

191 名前:デフォルトの名無しさん mailto:sage [03/01/18 22:10]
>>190
ttp://www.ki.rim.or.jp/~kuro/Java/JNI/JNI-05.html
なんかが参考になるかもね

192 名前:デフォルトの名無しさん mailto:sage [03/01/18 22:21]
>>190
呼び出しが例外を起こす可能性があるなら、
必ずチェックしなければならない。

188は嘘。騙された190はご愁傷さま。

193 名前:186 [03/01/18 23:50]
もいっちょお願いします。
.dllをJARに入れて配布するには、どうMANIFESTファイルを設定すればいいでしょうか。

194 名前:デフォルトの名無しさん mailto:sage [03/01/19 18:20]
>>193
>.dllをJARに入れて配布するには
無理じゃない?



195 名前:188,191 mailto:sage [03/01/19 22:17]
>>192
必死だと思われようがあえて書く。
185は "JNI Callしたあとって必ず" とあるから
"んなわけない" と書いたんですが。
例外を投げる可能性がある場合に
チェックしないといけないのは当たり前。

196 名前:デフォルトの名無しさん mailto:sage [03/01/19 22:20]
voidさんいらっしゃい。

197 名前:山崎渉 mailto:(^^)sage [03/01/23 20:11]
(^^)

198 名前:むー mailto:sage [03/01/24 04:05]
>>190
Javaメソッド呼んだ後にExceptionOccurredでチェックして例外発生して
たらC++例外投げるようなJNIEnvのラッパーみたいなの書いて、
nativeメソッド全体をtry-catchで囲んどいてラッパーから投げたC++例外
をキャッチしてJava側にさっくり戻る、みたいなことやったりしたらだめかね?


199 名前:デフォルトの名無しさん mailto:sage [03/01/24 23:46]
>>198
結局そうなりますた。
が、windowsでは動きましたがlinuxではJVMがクラッシュしますた。
例外が原因らしいことまでは分かったのですが・・・

200 名前:デフォルトの名無しさん mailto:sage [03/01/25 09:26]
>>199
そんなに甘くないのか… なんでだろう?
Linux版のJVMではJava例外の実装にC++の例外機構の何かを使って
バッティングしちゃった、とかそんな理由なんかな。
stack-unwindでJVMのスタックかどっかを破壊しちゃうとか。
core見ないとわかんなそうだけど、JVMのcore読みなんて鬱すぎる…

201 名前:デフォルトの名無しさん mailto:sage [03/01/26 06:15]
>>199
try catch なんてハイカラなもの使わずに goto するしか!

202 名前:デフォルトの名無しさん mailto:sage [03/01/26 09:25]
>>201
c++のデストラクタを活用してるコードがあるのよ・・・

203 名前:デフォルトの名無しさん mailto:sage [03/01/26 09:37]
>>200
こんなのありますた
mail.gnu.org/archive/html/bug-lib-gplusplus/2000-10/msg00004.html

ショボーン
mail.gnu.org/archive/html/bug-lib-gplusplus/2000-11/msg00006.html

ショボーン
wmf.editthispage.com/discuss/msgReader$3455?mode=topic

204 名前:デフォルトの名無しさん mailto:sage [03/01/31 00:01]
>>203
赤帽7.2とgcc2.96で、JDK1.4.1な環境だが、試したら大丈夫だたよー



205 名前:デフォルトの名無しさん mailto:sage [03/02/01 13:27]
>>204
マジですか?
つかgcc2.96ってどういうバージョンなんでしょう
本家には置いてないし・・・

206 名前:204 mailto:sage [03/02/02 07:38]
>>205
GNUでは2.96は開発版で配布に適さないといってるみたい。
ttp://gcc.gnu.org/gcc-2.96.html
でも、RedHat社のサイトにはRPMがまだあるみたいだね。
2.95や3.xと互換性はないらしいが。。。
2.95.2とか、3.2とかじゃうまくいかないのかな。
204の環境は借り物だったんで、他はわからんですわい。スマソ

207 名前:デフォルトの名無しさん mailto:age [03/02/20 17:08]
JNI通すところ自体はね。

208 名前:デフォルトの名無しさん [03/02/20 17:14]
なんでわざわざC++でつくられたバイナリをJAVAから使う必要があるのだ?
perlにしといたら?

209 名前:デフォルトの名無しさん mailto:sage [03/02/20 17:22]
>>208
なんでわざわざC++でつくられたバイナリをperlから使う必要があるのだ?

210 名前:デフォルトの名無しさん mailto:sage [03/02/20 17:40]
>>208
Javaでコーディングする部分のOSへの依存を下げるため

211 名前:デフォルトの名無しさん mailto:sage [03/02/20 17:58]
この間初めて JNI 使って Windows の CPU 使用率をとってみた。
結構簡単だった。

212 名前:デフォルトの名無しさん mailto:sage [03/02/20 19:46]
>>211
SNMP使えば、Windows でも Linux でも同じコードで CPU使用率とれるのに。。

213 名前:デフォルトの名無しさん [03/03/07 21:59]

page5.auctions.yahoo.co.jp/jp/auction/e22909695

ヤフオク出品したよ
1円スタートでマジお勧め!

「10日でおぼえるJSP/サーブレット入門教室」翔泳社



214 名前:デフォルトの名無しさん mailto:sage [03/03/07 22:05]
あげ荒らし氏ね



215 名前:電波さん mailto:sage [03/03/16 03:16]
現在VMに興味があって最近勉強しだしたところ。
このスレ結構面白いです。

JNIなんて「共有オブジェクト読んで関数呼べば良いんだろ」程度に思ってたけど
結構やること多いのね。nativeコードからのJavaVMの呼び出しなんて念頭になくって
これから調べないといけないです。
勉強になります。

216 名前:デフォルトの名無しさん [03/03/22 08:12]
勃起age

217 名前:デフォルトの名無しさん mailto:sage [03/03/22 12:57]
いろいろ書籍やWEBサイトを参考にしてるんだが
どうやってもCからJVMをロードできない。
何か根本的に間違えてるのだろうか。

218 名前:デフォルトの名無しさん [03/03/22 17:08]
>なんでわざわざC++でつくられたバイナリをJAVAから使う必要があるのだ?

あなたTYPE2のJDBCドライバを使ったこと、ありませんか?

219 名前:デフォルトの名無しさん mailto:sage [03/03/23 02:58]
Pure じゃなくても、少しくらい汚れてしまった Java の方が萌える

>>212
SNMP って ICMP じゃなかったっけ?

220 名前:デフォルトの名無しさん mailto:sage [03/03/23 08:51]
>>219
> SNMP って ICMP じゃなかったっけ?

ハァ ? プロトコルの勉強しなおした方がいいんじゃない ?
www.arkweb.co.jp/~yukio/pro_ichiran.xls

221 名前:山崎渉 mailto:(^^) [03/04/17 15:51]
(^^)

222 名前:デフォルトの名無しさん [03/04/19 13:47]
結論:全部C++で。これ最強。

223 名前:山崎渉 mailto:(^^)sage [03/04/20 03:39]
   ∧_∧
  (  ^^ )< ぬるぽ(^^)

224 名前:デフォルトの名無しさん mailto:sage [03/04/27 13:02]
JavaでHello World JNI編
ttp://www.hellohiro.com/native.htm



225 名前:山崎渉 mailto:(^^) [03/05/28 13:13]
     ∧_∧
ピュ.ー (  ^^ ) <これからも僕を応援して下さいね(^^)。
  =〔~∪ ̄ ̄〕
  = ◎――◎                      山崎渉

226 名前:デフォルトの名無しさん mailto:sage [03/06/11 05:51]
swig使ってJNI部分を自動生成してみたんだけど結構便利そう
swig-jp.dyndns.org/

227 名前:デフォルトの名無しさん mailto:age [03/06/15 00:11]
いえいえ、誘導どうもありがとうございます。

228 名前:デフォルトの名無しさん mailto:2sf1-mcl [03/06/15 00:43]
   /⌒ヽ 
  /  ´_ゝ`)   IP子です。よろしこ
  |    /   
  | /| |   
  // | |  
 U  .U

↑ゲーム製作技術板のなんとか君みたい!
ここのマスコットキャラにしよう

229 名前:山崎 渉 mailto:(^^) [03/07/15 10:51]

 __∧_∧_
 |(  ^^ )| <寝るぽ(^^)
 |\⌒⌒⌒\
 \ |⌒⌒⌒~|         山崎渉
   ~ ̄ ̄ ̄ ̄

230 名前:山崎 渉 mailto:(^^) [03/07/15 14:02]

 __∧_∧_
 |(  ^^ )| <寝るぽ(^^)
 |\⌒⌒⌒\
 \ |⌒⌒⌒~|         山崎渉
   ~ ̄ ̄ ̄ ̄

231 名前:山崎 渉 mailto:(^^)sage [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 名前:デフォルトの名無しさん mailto:sage [03/08/15 06:06]
やったことないけど。

Cで作成したDLLからそのUUSBD.DLLをいじればいいのでは?


234 名前:デフォルトの名無しさん [03/08/15 14:26]
>>232
UUSBD.DLLを使用するプログラムを
JNIにすればいいだけではないのか?
間にかませるって言うことだ



235 名前:山崎 渉 mailto:(^^) [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 名前:デフォルトの名無しさん mailto:sage [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 mailto:sage [03/08/18 02:11]
>>241
別に煽っても釣ってもないです。
JNIの存在意義と正しい使い方がわかってないのに
JNIとか叫んでる人達(>>1-30くらいで痛いほど見れます)が大杉。

必要性云々ではなくて機種依存性を正しく局所に押さえ込めてますか?
もっというとネイティブAPIをちゃんとラップして使ってますか?
っていうレベルで。>>1-30を見ると正直怪しい。
SWTとかどうでもいいよ。
コンポーネントとして成立してればその部分を移植できれば他でも動くんだからさ。



244 名前:デフォルトの名無しさん mailto:sage [03/08/18 07:49]
> JNIは、jdk1.5を目前としているいまでは、ほとんど使う必要がないだろう

何か素晴らしい仕組みが1.5には入るの?



245 名前:デフォルトの名無しさん mailto:sage [03/08/18 14:07]
swigならJNIで使うヘッダや関数を定義したファイルを作れば
自動的に定義された関数にアクセスするC言語のJNIソースと
Javaソースを自動生成してくれるのに
Java使いは誰も知らなさそうなのが残念

246 名前:デフォルトの名無しさん [03/08/18 17:09]
俺はSWINGというより、レジストリアクセスやウィンドウキャプチャとか
アーカイバDLLで圧縮処理とかそう言うレベルの仕事がしたかったんだけど。
Javaで。
無理かな?

247 名前:デフォルトの名無しさん mailto:sage [03/08/18 18:00]
>>246
swig
swig-jp.dyndns.org/exec_html

swing
java.sun.com/products/jfc/

248 名前:デフォルトの名無しさん mailto:sage [03/08/18 20:08]
Tigar (Java2 SE 1.5) のJava 言語仕様の拡張
www.mtl.t.u-tokyo.ac.jp/~nminoru/java/j2se15.html

genericsとautoboxingはうれしいな。for はなんかスクリプトっぽくて気持ち悪い。
aspectjは入らんのな。プロパティの設定は面倒くさいまんまか。

249 名前:デフォルトの名無しさん mailto:sage [03/08/18 20:48]
>>248
隼(1.4)から虎(1.5)へ〜JDK1.5について!
pc2.2ch.net/test/read.cgi/tech/1056807119/l50

【猿が】JavaニGenericsハ不要 【ソース汚す】
pc2.2ch.net/test/read.cgi/tech/1055519583/l50

あたりでやってくれ。

250 名前:246 [03/08/19 13:07]
>>247
ちょっと逝ってくる。





ただいま。

251 名前:デフォルトの名無しさん mailto:sage [03/08/19 15:23]
おかえり

252 名前:デフォルトの名無しさん [03/08/20 16:16]
age

253 名前:デフォルトの名無しさん mailto:sage [03/09/18 02:15]
sage

254 名前:デフォルトの名無しさん [03/09/25 20:58]
それでもおまいらはJNIをおいそれと使いますか?



255 名前:デフォルトの名無しさん mailto:sage [03/09/25 22:59]
java から c を呼び出すのでなく
c から java を呼び出すのに最近はまってる。

ライブラリが充実してて非常によい。
普通に c/c++ のライブラリ使えという話もあるが。

256 名前:デフォルトの名無しさん [03/09/28 06:32]
>>255
むしろ普通にJavaを使え。
JNIでスタートアップルーチンだけ用意して。

257 名前:デフォルトの名無しさん mailto:sage [03/09/28 08:12]
>>1
レスを荒らす方法を教えてください。。。

258 名前:デフォルトの名無しさん mailto:sage [03/10/01 05:33]
C言語からJavaを呼び出すのってバージョン依存激しそうに見えるんだけどそうでもない?

259 名前:デフォルトの名無しさん mailto:sage [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 名前:デフォルトの名無しさん mailto:sage [03/10/15 00:00]
win32apiのJNI用ラッパか・・・
MSが自社用JavaVM専用に作ろうとしてSunとケンカして以来、
大きなものは誰も作ってないと思う

263 名前:261 mailto:sage [03/10/17 21:03]
>262
レスありがとうございます。
自分の必要な分はwin32APIを
勉強して、なんとかできました。

264 名前:デフォルトの名無しさん mailto:sage [03/10/26 21:47]
swigつかって自分でSDLのラッパー作ってみればどうよ



265 名前:デフォルトの名無しさん mailto:sage [03/10/27 23:53]
javahでヘッダが出来るじゃないですか。んで
java_パッケージ名_クラス名_関数名(ネイティブメソッド)
ってなりますけど、既存の関数呼ぶにはやっぱりこの長い名前の関数から
呼ぶしかないですかね。教えてください。

266 名前:デフォルトの名無しさん mailto:sage [03/10/28 00:45]
>>265
swig使ったら自動的に生成してくれますよ

267 名前:265 mailto:sage [03/10/28 22:54]
自動で生成って。。。
既存の関数名では出来ないですかね?
調べてみます。

268 名前:デフォルトの名無しさん mailto:sage [03/10/31 13:49]
できないからswig使えってことじゃないの?

269 名前:デフォルトの名無しさん [03/11/06 14:32]
JAVAでC呼び出すなら最初からCで記述すればよくないですか?
何かメリットでもあるんでしょうか?

270 名前:デフォルトの名無しさん mailto:sage [03/11/06 14:36]
>>269
最終的に機械語にするんなら、なんで最初から機械語で書かないで C言語を使うのか?
ってのと同レベルの疑問だね。

271 名前:デフォルトの名無しさん mailto:sage [03/11/06 14:36]
JavaでCを使うのは既存のC言語ライブラリが長年使われているもので
実績があるもので、それを何とか再利用したいときなどにメリットがある。

けれどもJNIはJavaにとって苦肉の策。

基本はJavaで、というのが美しい。

272 名前:デフォルトの名無しさん [03/11/06 15:12]
>>271
おまえ、プログラマ?
デベロッパ用のソフトなんてJNIが絡んでるの多いぞ
そういうの作らないとわかんないとは思うけど

273 名前:デフォルトの名無しさん mailto:sage [03/11/06 15:31]
BASICから機械語呼び出すのとおんなじ
あああ懐かしい

274 名前:デフォルトの名無しさん [03/11/07 11:34]
JAVAからCを呼び出してPRINTFを使って文字を出力する単純な処理ができません。
ライブラリを作ってパスを通してもライブラリが見つからないというようなメッセージが出てしまいます。
どのようにすればいいのでしょうか?



275 名前:デフォルトの名無しさん mailto:sage [03/11/07 11:38]
>247
随分難易度の高いことしてんなー
わかったら本でも書け


276 名前:デフォルトの名無しさん [03/11/07 22:13]
CにSTRINGの文字列を引数として読み込む時に何で構造体を使わなくてはいけないのですか?

277 名前:デフォルトの名無しさん mailto:sage [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 名前:デフォルトの名無しさん mailto:sage [03/11/08 01:42]
>>278
構造体の話は何処行ったんだ?

> 消してしまって問題ないですか?
それは javah が自動生成したコードを削って良いかって話ですか?

javah が生成したファイルの先頭に
> /* DO NOT EDIT THIS FILE - it is machine generated */
って書いてあると思うんだが…

280 名前:デフォルトの名無しさん mailto:sage [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 名前:デフォルトの名無しさん mailto:sage [03/11/08 13:58]
>>281
> C単体で実行はしないのでCのソースのプロトタイプ宣言の部分は削っても問題ないですか?
オマエの手元にしかないソースに判断求められてもねぇ…

基本的に削ると何かメリットがあるのか良く考えてみた方が良いような。

283 名前:デフォルトの名無しさん mailto:sage [03/11/08 14:49]
>>281
構造体の話はどこいったんだ?

284 名前:デフォルトの名無しさん [03/11/08 18:36]
Cで適当に作った関数はプロトタイプ宣言をしなくてもJNIで呼び出せたので、別にプロトタイプ宣言なんてしなくてもいいじゃんと思いこんでいるのですが、そんな問題では無いのでしょうか?



285 名前:デフォルトの名無しさん mailto:sage [03/11/08 19:42]
おまいらのやっている事VBと同じやん。

286 名前:デフォルトの名無しさん mailto:sage [03/11/08 20:09]
>>284
構造体の話はどこいったんだ?

> Cで適当に作った関数はプロトタイプ宣言をしなくてもJNIで呼び出せたので、別にプロトタイプ宣言なんてしなくてもいいじゃんと思いこんでいるのですが、そんな問題では無いのでしょうか?

とりあえず、JNI に関する質問ではないので C の初心者スレにでも言って聞け。

287 名前:デフォルトの名無しさん mailto:sage [03/11/08 22:48]
JNIを扱うには、CとJavaとOSに精通してないと厳しいぞ。

288 名前:デフォルトの名無しさん mailto:sage [03/11/08 23:21]
>>287
おまいの言っている事VBと同じやん。

289 名前:デフォルトの名無しさん mailto:sage [03/11/08 23:27]
>>287
CとJavaとOS について初心者よりマシっつー程度の知識があれば JNI 使えます。

290 名前:デフォルトの名無しさん [03/11/09 12:59]
でもJNIの初心者向けのサイト行っても引数としてオブジェクト使ったり構造体のポインタをオブジェクトに対して使ったり、もう暗号みたいになっててよくわからんですよ。
優しく解説されている本とかあるんでしょうかね?

291 名前:デフォルトの名無しさん mailto:sage [03/11/09 13:41]
>>290
> でもJNIの初心者向けのサイト行っても引数としてオブジェクト使ったり構造体のポインタをオブジェクトに対して使ったり、もう暗号みたいになっててよくわからんですよ。
それは精進が足りん、ってだけの話では?

とりあえず、キミが JNI は良くわからない、と思っている事だけはわかった。
何がわからないのかはサッパリわからない。

292 名前:デフォルトの名無しさん mailto:sage [03/11/09 17:59]
JNIとは関係なくプロトタイプ宣言はしておいたほうがいいよ。
コンパイラが型チェックしてくれてコーディングミスを指摘してくれる。

293 名前:デフォルトの名無しさん mailto:sage [03/11/09 23:01]
SwigつかってJavaからSDLを使うラッパー作ったけど公開してほしい人っている?

294 名前:デフォルトの名無しさん mailto:sage [03/11/10 10:02]
>>293
公開したいんだろ? 公開したらいいじゃん。
まったく、いやらしい言い方する奴だな。



295 名前:デフォルトの名無しさん mailto:sage [03/11/11 03:45]
>>294
うぅ・・・気をつけます、どうやら誰も要らないみたいなんでひっそり封印します

296 名前:デフォルトの名無しさん [03/11/14 13:59]
日本語の文字列の受け渡しがさっぱり分からないのですがサンプルに書いてある通りに書いてみて、
こういうもんだと割り切って詳しく理解する必要はありませんか?

297 名前:デフォルトの名無しさん mailto:sage [03/11/14 15:43]
>>293
誰かが JSDL ってのを公開してたような…

298 名前:デフォルトの名無しさん mailto:sage [03/11/14 15:46]
>>296
> こういうもんだと割り切って詳しく理解する必要はありませんか?
その程度の情報で同意を求められても…

文字列は UTF 使うってのを忘れてる、とかじゃなくて?

299 名前:デフォルトの名無しさん [03/11/19 14:39]
Cで作った文字配列をJAVAに返すやり方がいまいちわかりません。
簡単な方法はありませんか?

300 名前:デフォルトの名無しさん mailto:sage [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 名前:デフォルトの名無しさん mailto:sage [03/11/19 17:48]
>>301
それは JNI とは関係ない話だ。自分で調べろ。

303 名前:デフォルトの名無しさん mailto:sage [03/11/19 19:56]
UTF8になってるならサポート関数があったと思う

304 名前:デフォルトの名無しさん mailto:sage [03/11/19 20:37]
>>303
それは >>296 のサンプルに書いてあると思われ。



305 名前:デフォルトの名無しさん mailto:sage [03/11/20 14:31]
すみませんでした。
知ったかぶりしてますた。

306 名前:デフォルトの名無しさん [03/11/20 19:19]
SPRINTFで取得した文字列をNEW OBJECT ARRAYを用いて作った配列に格納したいのですがJAVAプログラムの実行時にエラーが出てしまいます。
何かよい方法はないでしょうか?

307 名前:デフォルトの名無しさん mailto:sage [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 名前:デフォルトの名無しさん mailto:sage [03/11/20 19:52]
>>308
「New jObject」って何よ。

310 名前:デフォルトの名無しさん mailto:sage [03/11/21 00:46]
>306
ようするにキャラクタ配列をオブジェクト配列に入れたいということ?
型が違うから、char型をCharacterオブジェクト型にしないといけないと思うけど。

JNI使うと、エラー発生時に"このエラーをSUNに報告してくれみたいな"のが出たりして
大変だと思うけど地道に頑張ってください。

311 名前:デフォルトの名無しさん mailto:sage [03/11/21 01:46]
ここもネタ心者が出没するよーになったか。

文字列の受け渡しで二週間もハマる馬鹿が実在するとも思えんしなぁ…

312 名前:デフォルトの名無しさん mailto:sage [03/11/21 01:47]
>>310
>>274

313 名前:デフォルトの名無しさん mailto:sage [03/11/21 01:54]
>>308
構造体はどーなりましたか?

314 名前:ネタ心者 [03/11/21 09:25]
すみませんでした。
知ったかぶりしてますた。



315 名前:310 mailto:sage [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 名前:デフォルトの名無しさん mailto:sage [03/11/24 19:46]
解放ってどうやってやるつもりだ?freeか?

320 名前:デフォルトの名無しさん [03/12/20 04:24]
c++でウィンドウを作り,Javaから呼び出しています。
メインのウィンドウは出ますが、ダイアログが出ません。
同じソースファイルをcから呼ぶとダイアログも表示されます。
だれか教えてください。


321 名前:デフォルトの名無しさん mailto:sage [03/12/20 09:42]
>>320
環境が分からん。Win32か?

322 名前:デフォルトの名無しさん [03/12/20 16:14]
320です。
すみません。win32です。VC++6でdllをつくりました。
どうやらリソースエディタで作った、メニューやダイアログが
うまく読み込めてないみたいです。
どなたかアドバイスお願いします。

323 名前:デフォルトの名無しさん mailto:sage [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 名前:デフォルトの名無しさん mailto:sage [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 名前:デフォルトの名無しさん mailto:sage [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に変換しても駄目。
www.ki.rim.or.jp/~kuro/Java/JNI/JNI-03.html

仕方ないのでExceptionのサブクラスを作ってエラーメッセージを固定した。
当初の目的は果たせんだけど、すっきりしない。誰か解決法知らない?

332 名前:デフォルトの名無しさん mailto:sage [04/03/14 01:01]
日本語で困ったことはないな。
お前のコードが腐ってるんだろうよ。さらしてみ。

333 名前:331 mailto:sage [04/03/14 01:11]
上のサイトの一番下のDLL側コードの
char* src = "こんばんわ";
より下のソースをreturn result; → env->ThrowNew( jc, result);に
変更しただけなんだけど・・・

334 名前:デフォルトの名無しさん mailto:sage [04/03/14 01:20]
そのサイトのコードそのままだと日本語はちゃんとでるの?



335 名前:デフォルトの名無しさん mailto:sage [04/03/14 01:52]
>> env->ThrowNew( jc, result);に
2番目、jstringじゃだめでしょ。
szWideでいけない?


336 名前:デフォルトの名無しさん [04/03/14 03:25]
CのプログラムからHORB(つまりJAVAをつかった関数)をつかって離れた端末の関数をたたくってことはできますか?

337 名前:デフォルトの名無しさん mailto:sage [04/03/14 03:31]
>>336
できるよ。

HORB使うと決まっているのなら、CのプロセスとJavaのプロセスを両方たてて、
socketなんかでプロセス間通信したほうが楽だと思う。

338 名前:デフォルトの名無しさん [04/03/14 04:09]
>>337
情報ありがとうございます。

それならば、Cのプロセスと離れた端末のCのプロセスでソケット通信した方がいいですね。
HORBは、非常に簡単に離れた端末の関数をたたけるのは知っています。
C<->JAVA間のインタフェース設計が、普通に関数をたたくように設計でき、かつ簡単ならばチャレンジしようかなと思ったしだいです。

339 名前:デフォルトの名無しさん mailto:sage [04/03/14 14:56]
なぜにいまさらHORB?
RMI-IIOPするほうが現実的かと。


340 名前:331 mailto:sage [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 名前:デフォルトの名無しさん mailto:sage [04/03/16 01:10]
んー、そこまではできてるなら
ThrowNewはあきらめてThrowを使うとか。
Exceptionのインスタンスはjstring引数にして生成する。


342 名前:341 mailto:sage [04/03/16 01:35]
あー、わかった。そこでできてるWCHARを
WideCharToMultiByteでCP_UTF8のcharにして渡せばいいんだ。

343 名前:デフォルトの名無しさん mailto:sage [04/03/16 22:57]
ThrowNewのchar*が食えるのは、なるたけメモリを確保せずにthrowするための
緊急回避なんじゃねえかなあ。

344 名前:デフォルトの名無しさん mailto:age [04/04/07 10:37]
Java側 → Win32dllは、JNIにて実現できる通信ですが、
Win32exe(プロセス) → Java側を実現するには、どのような手段が一番いいですかね?

アプリケーション間通信だけできればいいので、できればあまり大げさにはしたくないです。
Win32間でないからパイプは無理だし、一つのOS上での通信なのでソケット通信は少々大げさかなと。



345 名前:デフォルトの名無しさん mailto:sage [04/04/07 10:38]
>>344
>Win32間でないからパイプは無理
嘘だろ?

346 名前:デフォルトの名無しさん mailto:age [04/04/07 11:06]
>>345
Javaでパイプ使えるか?

347 名前:デフォルトの名無しさん mailto:sage [04/04/07 11:12]
Win32API中のパイプ関連のAPIを全てJNIでラップしたら
使えるんでないの?

348 名前:デフォルトの名無しさん mailto:sage [04/04/07 14:32]
>>345 Javaでパイプは使えるよ。

349 名前:デフォルトの名無しさん mailto:age [04/04/07 15:03]
>>348
それって、Javaのスレッド間通信のためのパイプであって、Win32-Java間のパイプではないんでないの?

350 名前:デフォルトの名無しさん mailto:sage [04/04/07 15:20]
>>348
それって NIO の Pipe の事いってんの?

個人的には >>347 で NIO の Pipe 実装するのが良いかと。

351 名前:デフォルトの名無しさん mailto:sage [04/04/07 16:16]
>>349 パイプって標準入出力みたいにOSが提供する入出力だろ。名前付きでも、名前無しでも。

352 名前:デフォルトの名無しさん mailto:sage [04/04/07 16:27]
>>351
OSが提供する入出力を、Javaは間接的にしか利用できないから、
それを使ってWin32とは対話できないのでは。

353 名前:デフォルトの名無しさん mailto:sage [04/04/07 23:02]
win32の中でJVMを生成する、ってのはダメなの?

354 名前:デフォルトの名無しさん mailto:sage [04/04/07 23:52]
> 一つのOS上での通信なのでソケット通信は少々大げさかなと。

これが一番やりやすいと思う。



355 名前:デフォルトの名無しさん [04/06/04 21:22]
SWIGの日本語ページってどうなったか誰か知りませんか?
swig-jp.dyndns.org/exec_html

ちなみに本家www.swig.org/

356 名前:デフォルトの名無しさん mailto:sage [04/06/06 00:04]
おまえら、SolarisとLinuxプラットフォーム以外の環境で、
native内でシグナルハンドラ使うんじゃねーぞ。

357 名前:デフォルトの名無しさん mailto:sage [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 名前:デフォルトの名無しさん mailto:sage [04/06/30 11:29]
>>358
dll の置き場所が悪い。

360 名前:358 mailto:sage [04/06/30 11:41]
dllファイルを*.javaファイルと同じ場所に置いたら上手く動作しました。
てっきり*.classファイルと同じ場所に置くものと勘違いしてました。
>>359様、ありがとうございました。

361 名前:デフォルトの名無しさん [04/08/12 01:04]
「-> か ->* の左には構造体のポインタが必要」

nativeのソース(C言語)をコンパイルすると上のようなエラーが出るのですがなぜですか?
エラーが出ている箇所は以下の文です。

return env->NewStringUTF("Hello World");

インクルードパスはきちんと追加しています。
javahで作成したヘッダもインクルードしています。

362 名前:デフォルトの名無しさん mailto:sage [04/08/12 07:05]
JNIのこと知らんが、こうしてみたら?
return NewStringUTF(env, "Hello Wrold");


363 名前:デフォルトの名無しさん mailto:sage [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 名前:デフォルトの名無しさん mailto:sage [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 名前:デフォルトの名無しさん mailto:sage [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 名前:デフォルトの名無しさん mailto:sage [04/08/13 21:53]
#ifdef __cplusplus
#define ENV (*env)
#else
#define ENV env
#endif


ENV->GetArrayLength(env, array);

371 名前:デフォルトの名無しさん mailto:sage [04/08/17 14:31]
>>370
それC++じゃコンパイル通らんだろ。

372 名前:デフォルトの名無しさん [04/10/14 01:11:03]
>>370
逆じゃないの?

373 名前:デフォルトの名無しさん mailto:sage [04/10/14 02:56:47]
逆ではあるが、それを正したところでC++じゃだめだし。

374 名前:デフォルトの名無しさん [04/12/09 00:41:58]
JNIでdefineClassメソッドを使ってbyte配列から取得したクラス情報を元に、インスタンスって生成できますか?
それにしても、JNIのDefineClassってどうやって使うんだろう・・。



375 名前:デフォルトの名無しさん mailto:sage [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 を返します。

ttp://java.sun.com/j2se/1.4/ja/docs/ja/guide/jni/spec/functions.doc.html


377 名前:デフォルトの名無しさん mailto:sage [04/12/09 01:17:16]
いや、それやりたいのならJNI必要ないだろうという意味だ
コアAPIでできるんだから


378 名前:374 [04/12/09 07:48:29]
>>377
それをネイティブコードでかけるかという質問なんです。

379 名前:デフォルトの名無しさん mailto:sage [04/12/09 08:06:41]
>>378
書けるだろ。
JNIじゃなくてJavaのクラスファイルに関する知識が必要になるだけで。

380 名前:デフォルトの名無しさん mailto:sage [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 名前:デフォルトの名無しさん mailto:sage [04/12/09 22:59:57]
IT用語辞典 e-Words : JNIとは 【Java Native Interface】 ─ 意味・解説
e-words.jp/w/JNI.html

384 名前:デフォルトの名無しさん [04/12/11 12:30:12]
>>379
書いてみて。



385 名前:デフォルトの名無しさん mailto:sage [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 名前:デフォルトの名無しさん mailto:sage [04/12/13 18:49:12]
>>387
それを言うなら
#NI(シャープニー)だろ?
グぐれ

389 名前:デフォルトの名無しさん mailto:sage [04/12/14 03:15:20]
>>387
.netのC#で作った.dllファイルのメソッドを呼ぶdllを作ればいい

390 名前:デフォルトの名無しさん [04/12/18 21:10:34]
>>376
JNIインタフェースのDefineClassって、
バージョン毎にシグネチャが異なるのか?
それともヘルプが間違ってるだけなのか?

あと使い方誰か教えてくれ。
何度やってもネイティブコード上でうまくインスタンスを取得できない。

391 名前:デフォルトの名無しさん mailto:sage [04/12/18 21:48:44]
ttp://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=17383&forum=12&6

392 名前:デフォルトの名無しさん mailto:sage [04/12/18 22:24:33]
>>391
……上手くいかない理由がわかったような気がする。

393 名前:390 [04/12/18 23:04:05]
>>392
教えてくれ!
何が原因なんだ。
つーか、仕様上無理なのか?

394 名前:デフォルトの名無しさん mailto:sage [04/12/18 23:08:43]
つーか、バイトコードを暗号化しても、すぐにやぶられるって。



395 名前:デフォルトの名無しさん mailto:sage [04/12/18 23:10:13]
>>394
>>390 がやっても、ってんなら同意。

396 名前:デフォルトの名無しさん mailto:sage [04/12/19 13:04:15]
どうせVMが実行するときにデコードしてるんだからいみないな

397 名前:390 [04/12/19 13:40:24]
>>394
>>395
>>396
そこからクラスファイルを生成し、ソース入手可と言っている?

398 名前:デフォルトの名無しさん mailto:sage [04/12/19 15:41:10]
> そこからクラスファイルを生成し、ソース入手可と言っている?
可能。

せいぜい>390がいくら頑張っても、Jad使ってお手軽一発変換、ってのを防ぐ程度の
ことしかできんだろう。

399 名前:デフォルトの名無しさん mailto:sage [04/12/19 16:02:26]
そういうこと

苦労してJNIでクラスローダ作ったところでいくらでもいじられるんだし
JNIのコードだってスタックサイズの制限とかで大きいの作れないんだから
余裕で解析されるだろうな

それくらいなら帯域とかあるだろうがURLクラスローダを継承して通信を暗号化、
毎回ロードするほうがまだ現実的

ネトゲとかでいくらネイティブコードでもbotとかツールとかなくせないわけだしね
安全性のためにJNIってのは意味ない

400 名前:デフォルトの名無しさん mailto:sage [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 名前:デフォルトの名無しさん mailto:sage [04/12/20 00:48:32]
クラスが暗号化されようとJREの上で動くときには普通のクラスだろ

403 名前:デフォルトの名無しさん mailto:sage [04/12/20 11:22:32]
たぶん390はVMの中は外から絶対のぞけないと思い込んでいるに一票。

404 名前:デフォルトの名無しさん mailto:sage [04/12/20 21:43:16]
この辺を参考にしてから googleで検索してみろ
java.sun.com/j2se/1.4/ja/docs/ja/guide/jni/spec/functions.doc.html#15982




405 名前:デフォルトの名無しさん [04/12/21 13:59:21]
初歩的な質問かもしれませんが、教えてください。

JavaからJNIを利用して既存のdllにアクセスする場合、オススメの方法はあるでしょうか?
何通りかあるのかもしれませんが...。
「既存のdllは一切変更しない」ことが条件です。
たとえば、間にラッパー(?)をかますとして
「dllを指定し、利用するAPIを選択すると自動でラッパー(またはそのベース部分)を生成してくれるツール」とか...。
Java以外の言語にも精通し、JNIゴリゴリが得意な方は不要かもしれませんが、
「JavaからJNIを利用して既存のdllにアクセスする」を目的とする場合、需要があると思うのですが?

よろしくお願いします。


406 名前:デフォルトの名無しさん mailto:sage [04/12/21 16:15:32]
ラッパーつくるしかないよ

大概符号つきをどうするかとかその辺があるわけで

407 名前:デフォルトの名無しさん [04/12/23 18:18:03]
質問ですが、一般的にJNIといった場合、JVMTI,JVMPI,JVMDI等はその中に含まれると考えていいのでしょうか?


408 名前:デフォルトの名無しさん mailto:sage [04/12/23 19:17:20]
それらすべてともちがうかと
JNIといった場合はネイティブコードを呼び出す、もしくはネイティブコードからJVMを呼び出すのが目的だから

ってすべて検索すれば詳細出てくるんだが釣り?

409 名前:デフォルトの名無しさん mailto:sage [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 名前:デフォルトの名無しさん mailto:sage [05/02/10 03:04:34 ]
> 失敗する

どのような失敗

411 名前:409 mailto:sage [05/02/11 03:38:07 ]
>>410
2回目以降の JNI_CreateJavaVM が失敗しているって感じです.
今は手元にコードがないので,後日詳細な報告をします.


412 名前:409 mailto:sage [05/02/12 06:25:57 ]
>>410
例えば下記のサイトのコードを流用したとします.
ttp://www.ki.rim.or.jp/~kuro/Java/JNI/JNI-07.html

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 名前:デフォルトの名無しさん mailto:sage [05/02/12 09:51:15 ]
エラーコード・・・

414 名前:デフォルトの名無しさん mailto:sage [05/02/12 14:03:45 ]
>>412
エラーコードを出し惜しみするのは宗教上の理由か?もう答える気なくした。



415 名前:409 mailto:sage 宗教上の理由でも何でもなくて睡眠不足でしたorz [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 名前:デフォルトの名無しさん mailto:sage [05/02/14 00:30:03 ]
超呼べる。呼びまくり。

418 名前:デフォルトの名無しさん mailto:sage [05/02/14 02:40:44 ]
>>417
おぉJNIって凄いんだ

それってDLLの中でJVMを作成して?
それともよくあるサンプルみたいにコールバックでって意味で?


419 名前:デフォルトの名無しさん mailto:sage [05/02/14 09:23:52 ]
どっちがやりたいん?
ほとんどの場合はnative methodの実装ですむはずだけど・・・

420 名前:デフォルトの名無しさん mailto:sage [05/02/14 11:04:52 ]
どっちて言いますか…

EXE→DLL→Javaのメソッドって感じにしたいんです
それで普通にEXEからJavaのメソッドを呼ぶ方法は分かるんです
でもDLLの中でJVMを作成して呼ぶ方法を試していて失敗してるんです
ClassFindって関数で失敗してるんで、クラスパスの設定あたりかもしれないんですけどorz

それで>>418の質問をしたんです
どうかDLLの中でJVMを作成して、そこからJavaを呼ぶ方法を教えてください


421 名前:デフォルトの名無しさん mailto:sage [05/02/14 19:30:01 ]
え、ClassFindのエラーの原因を調べればいいんじゃないの

422 名前:デフォルトの名無しさん mailto:age [05/02/22 19:48:43 ]
面白そうなことやってるな

423 名前:デフォルトの名無しさん [2005/06/17(金) 17:21:30 ]
NIOっていうかDirectByteBufferを駆使しようぜ

424 名前:デフォルトの名無しさん mailto:sage [2005/06/19(日) 13:16:52 ]
jarファイルをexeに変換するexewrapというツールがある。
これソースを公開してる。JNI使ってVM作ったり、
exe埋め込みリソースからクラスを生成しているようなので
参考になるかもしれんよ。



425 名前:デフォルトの名無しさん mailto:sage [2005/06/19(日) 13:45:58 ]
DirectByteBufferってアレだな
X11のshm拡張に似たものがあるな

単なるバイト列をやり取りする需要ってどんなもんだろう
画像とかか?

426 名前:デフォルトの名無しさん mailto:sage [2005/06/19(日) 14:31:18 ]
でもデスクトップ上で扱うタイプなら単純なバイト列というより
BufferedImageとかで扱うことが多いもんだから
shortやint型配列とかのほうがオーバーヘッドもないし便利

427 名前:デフォルトの名無しさん mailto:sage [2005/07/06(水) 23:21:04 ]
LinuxでJNIで何か処理をすると、StackOverflowErrorが発生するのですが、
何か情報ないでしょうか?


428 名前:デフォルトの名無しさん mailto:sage [2005/07/06(水) 23:58:15 ]
Windowsでも同じく発生するよ
スタックはかなり小さくないと動かない模様

Java自体のソースコードを修正してコンパイルしなおしが必要

429 名前:デフォルトの名無しさん mailto:sage [2005/07/07(木) 00:06:36 ]
>>425
ByteBufferからIntBufferやShortBufferに変換できるから無問題

430 名前:デフォルトの名無しさん mailto:sage [2005/07/07(木) 00:20:21 ]
>>428
Windowsで同じソース(ネイティブコードは除く。ただし、処理内容は同じ)を走らせても
StackOverflowError は発生しないのにLinuxでは発生してしまいます。
何が原因なのか調べる手段だけでもアドバイスもらえないでしょうか?


431 名前:デフォルトの名無しさん mailto:sage [2005/07/07(木) 00:48:35 ]
スタックサイズを指定すればいいんでないかのぉ?
66.102.7.104/search?q=cache:p9HE6z6XBvIJ:docs.hp.com/ja/5589/p09.html+Java+JNI+%E3%82%B9%E3%82%BF%E3%83%83%E3%82%AF%E3%82%B5%E3%82%A4%E3%82%BA&hl=ja&lr=lang_ja&client=firefox-a


432 名前:デフォルトの名無しさん mailto:sage [2005/07/07(木) 00:57:08 ]
残念ながらJNIのスタックサイズは有効にならないよ

433 名前:デフォルトの名無しさん mailto:sage [2005/07/07(木) 00:58:14 ]
>>430
Java自体のコンパイルってのはVMのことね

J2SE5.0の新しいライセンスでダウンロードしてコンパイルしなおすしかない


434 名前:デフォルトの名無しさん mailto:sage [2005/07/07(木) 20:52:39 ]
>>433
残念ながら、アプリの配布をVMと一緒にという訳にはいかないので
何か違う方法を探してみます。
ちなみに、JNIに関わりの無いところでは、相当量のスタックを使ってもオーバーフローしていません。



435 名前:デフォルトの名無しさん mailto:sage [2005/07/07(木) 21:06:17 ]
>>434
当たり前
Javaのスタックとはまったく別物だし

436 名前:デフォルトの名無しさん mailto:sage [2005/07/08(金) 00:21:16 ]
原因が分かりました。
ネイティブ側のメモリリークに、ガーベッジが重なったときにVMがアボートしていました。
どうりで特定の場所で落ちない訳です。
StackOverflowErrorはVMが異常な状態のときにスローされていたので、
恐らく関数ポインタがズレたせいだと思います。


437 名前:デフォルトの名無しさん mailto:sage [2005/10/02(日) 14:10:30 ]
>>425
亀レスやけど、
DDAとか、memory mapped I/Oとか、
特に組み込みでVRAMなんかに使うんでしょ。

438 名前:デフォルトの名無しさん [2005/10/04(火) 15:07:02 ]
DLL から JNI を呼ぶ場合、DestroyJavaVM()は、他にJavaVMを使用中の
スレッドが存在すると JavaVM がアンロードできないみたい。
(DestroyJavaVM() で終了まちになる・・・)

強制的に DestroyJavaVM() でJavaVMをアンロードする方法ってあるの?

439 名前:デフォルトの名無しさん mailto:sage [2005/10/04(火) 17:07:35 ]
えーと、マルチスレッドプログラミングの基本なんですが、
スレッドは、各々自分の責任において、終了処理を行うべきです。
// Thread.stop()がdeprecatedであるのと同じ理由。
ですから、JVM内できちんとThreadの終了を行うのが正当なやり方です。

どうしても強制的に終了したければ、
JVMのなかでdeprecatedなThread.stop()を矯正終了用のmethodで使ってみてください。
java.sun.com/j2se/1.4.2/docs/guide/misc/threadPrimitiveDeprecation.html

440 名前:デフォルトの名無しさん mailto:sage [2005/12/19(月) 19:39:34 ]
Cで作ったクラスインスタンスや構造体をJavaに渡すことは可能?
Javaで使えなくても、次のDLLの関数呼びに使うために

441 名前:デフォルトの名無しさん mailto:sage [2005/12/21(水) 09:03:27 ]
long値にポインタつっこもうぜ

442 名前:デフォルトの名無しさん mailto:sage [2005/12/21(水) 20:11:40 ]
それでDLL側で作ったメモリの領域が保たれるのか。
CとJava別個に考えてたけど、普通に使えるのね。
やってみる。

443 名前:デフォルトの名無しさん mailto:sage [2005/12/21(水) 23:30:29 ]
保たれはせんだろ。単なるポインタだし。


444 名前:ハーピィ mailto:sage [2005/12/24(土) 01:08:28 ]
E・∇・ヨノシ <444ゲット♫



445 名前:デフォルトの名無しさん [2006/02/15(水) 11:09:40 ]
消えちゃ勿体ないのでageちゃいます

446 名前:デフォ mailto:sage [2006/03/18(土) 14:47:41 ]
ふんとだもっだいね。

447 名前:デフォルトの名無しさん [2006/03/24(金) 11:41:57 ]
Bufferクラスって
JNIで実装されてるんだよね

448 名前:デフォルトの名無しさん mailto:sage [2006/03/27(月) 14:03:54 ]
外部メモリを取るやつがあるからな

449 名前:デフォルトの名無しさん [2006/04/09(日) 08:02:11 ]
void getValues(long &x, long &y);
のような関数をJNIで呼びたいのですが、
それにはx, y をメンバーに持つオブジェクトを使う
しかないのでしょうか?

450 名前:デフォルトの名無しさん mailto:sage [2006/04/09(日) 21:19:38 ]
そう。
あとその質問にJNIは関係ない。

451 名前:デフォルトの名無しさん mailto:sage [2006/04/15(土) 16:32:50 ]
cygwin環境でjava動かしてるんだけど.soって読み込む方法ってあるかな?

452 名前:デフォルトの名無しさん [2006/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 名前:デフォルトの名無しさん [2006/04/17(月) 10:08:07 ]
すみません、JNI_CreateJavaVM の間違いでした。
JREをインスコすると C:\Windows\java.exe が
インストールされるので、Java プログラムを
実行している分にはパスのことを気にしなくてもいいんですが、
JNI でごりごり遊ぶにはいろいろとパスを通さなくては
なりませんか?面倒なのでネイティブプログラムと
同じディレクトリに jvm.dll をコピーしてるんですが。

454 名前:デフォルトの名無しさん mailto:sage [2006/04/17(月) 13:20:39 ]
> 同じディレクトリに jvm.dll をコピーしてるんですが。
これが原因と見た。



455 名前:デフォルトの名無しさん [2006/04/17(月) 13:26:35 ]
>>454 やっぱそうですか・・・
Windows で JNI で遊んでる皆さん、
よかったらJava関連ではどこにPATHを通してるか、
さらしてもらえませんか??

>>452 のように Java アプリから呼び出した
C の関数から、さらに Java のメソッドを
コールバックさせることはできているので、
まったく何もかもがうまくいっていない、
というわけじゃないと思うんです。

456 名前:デフォルトの名無しさん mailto:sage [2006/04/17(月) 15:09:26 ]
息長ぇなこのスレ。

457 名前:デフォルトの名無しさん [2006/04/18(火) 00:04:55 ]
Java Forums - can't create java vm ... setting path for jvm.dll
forum.java.sun.com/thread.jspa?messageID=4176546
この辺も眺めながらもういっぺんトライしてみます。

458 名前:デフォルトの名無しさん [2006/04/19(水) 02:48:31 ]
質問です。
Java 5から導入されたアノテーション情報(特にクラスに埋め込んであるタイプのもの)に、
JNIからアクセスできるのでしょうか。

SunのサイトにJNI 5.0とかいうのがあったので見てたのですが、それらしいものは見つかり
ませんでした。どんなものでしょうか。

459 名前:デフォルトの名無しさん [2006/04/19(水) 08:33:43 ]
JAVAからJVMのメリットをなくしたらデメリットしか残らない

460 名前:デフォルトの名無しさん [2006/05/22(月) 09:43:09 ]
JNIでネイティブのDLLを呼び出すJAVAアプリ作ったんだけど、
JARファイルにまとめると動いてくれないよ。(エラーも出ずに何も反応無く終了する)
JARファイル中のDLLを読み込むにはloadLibraryかloadじゃなくて
findLibraryかなにかで読み込めば良いの?

461 名前:デフォルトの名無しさん [2006/05/22(月) 10:00:30 ]
>>460
標準のJNIのローダーはjarに対応してたっけ?
ネイティブのファイルシステムに置いて無いとダメじゃないのか?

462 名前:460 [2006/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 名前:デフォルトの名無しさん [2006/05/22(月) 14:44:43 ]
DLLはJavaの仕組みではなくWindowsの仕組みだからな。

464 名前:デフォルトの名無しさん mailto:sage [2006/06/27(火) 09:56:25 ]
>>462
ttp://www-06.ibm.com/jp/developerworks/opensource/030822/j_os-jws.html



465 名前:デフォルトの名無しさん [2006/07/04(火) 21:18:40 ]
時給1000円でJava教えてくださるかたを募集します
場所 所沢(池袋・高田馬場から直通)

i−want−to−study−java@hotmail.co.jp
(アドレスは全角で書いてあるので半角に直してください)
よろしくおねがいします

466 名前:デフォルトの名無しさん mailto:sage [2006/07/05(水) 02:21:36 ]
コンビニのバイトより安いですが、よろしくお願いします。

467 名前:デフォルトの名無しさん mailto:sage [2006/07/05(水) 21:37:03 ]
もち交通費別だよな

468 名前:デフォルトの名無しさん [2006/07/05(水) 23:55:10 ]
値段交渉したら、時給上げてくれた

469 名前:デフォルトの名無しさん mailto:sage [2006/07/12(水) 10:54:51 ]
はじめまして,今までJavaしか触ったことがなかったのですが,

470 名前:469 mailto:sage [2006/07/12(水) 11:11:20 ]
すみません,間違えてエンター押しちゃいました;;
Win32APIを使う必要があり,JNIにを使い始めたものです.

C++側でから渡されたString型の引数はjchar型として扱うようなのですが,
jchar→WCHARの変換はどのようにすればよいのでしょうか?

const WCHAR *Uni = env->GetStringChars(jstring, NULL);

のようにすれば普通にWCHAR形式として取り込めると書いているページも
あったのですが,こちらの環境では

> 'const jchar' から 'const WCHAR *' に変換できません。

とエラーがでます.
ttp://www.ki.rim.or.jp/~kuro/Java/JNI/JNI-03.html
を参考にして,せめて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 名前:デフォルトの名無しさん mailto:sage [2006/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 mailto:sage [2006/07/12(水) 14:15:25 ]
>>471
ありがとうございます.早速試してみます.
また何かあったら,書き込むかもしれないのでよろしくお願いします.

473 名前:469 mailto:sage [2006/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 mailto:sage [2006/07/12(水) 15:02:49 ]
VisualStudio6.0SP6の環境では問題無くコンパイルして動作しておりましたが、
VC++2005 Expressで駄目な理由は判りかねます…。



475 名前:471 mailto:sage [2006/07/12(水) 15:25:57 ]
(LPCWSTR)jchr
明示的にキャストしても駄目でしょうか?

476 名前:469 mailto:sage [2006/07/12(水) 21:07:20 ]
>>475
ありがとうございます!!
無事にできました.今までずっとJavaしか触ったことがなかったのですが,
今回C++を触り始めて改めてJavaのありがたさを思い知ってます.

477 名前:デフォルトの名無しさん [2006/07/17(月) 20:59:54 ]
時給1000円でJava教えてくださるかたを募集します
場所 所沢(池袋・高田馬場から直通)
よろしくおねがいします
i−want−to−study−java@hotmail.co.jp
教える対象は超初心者です。

専門学校などでJavaを勉強されていて夏休みだけ教えたいという方も歓迎です


478 名前:デフォルトの名無しさん mailto:sage [2006/07/18(火) 05:15:38 ]
> 465-468

479 名前:デフォルトの名無しさん [2006/09/05(火) 22:25:34 ]
JNIの勉強をしているのですが,CPU使用率のように連続的にデータを取得する際,
Java側からwhileループをまわして何度もdllを読み込むという非効率な方法をとっています.
一度dllを呼び出すだけで連続的に返り値を読み取る方法はあるのでしょうか
ご教授お願いします.

480 名前:デフォルトの名無しさん mailto:sage [2006/09/05(火) 22:36:18 ]
>>479
dll読み込む、dll呼び出すってのが、具体的に何を指して言ってるのかわからん。

481 名前:479 mailto:sage [2006/09/07(木) 12:53:19 ]
>>480
言葉が足りなくてすみません.
dll読み込む、dll呼び出すというのは,ネイティブメソッドを実行するという意味で書きました.
現在はネイティブメソッド実行時に,返り値としてCPU使用率を取得しているのですが,
この方法ではJava側でWhileループで何度もネイティブメソッドを実行する必要があります.
ネイティブメソッド側でWhileループをつかってJavaに連続的に値を返す方法は
ないのでしょうか

482 名前:デフォルトの名無しさん mailto:sage [2006/09/07(木) 18:52:07 ]
>>481
ネイティブ側では java.nio.ByteBuffer#allocateDirect(int) で得られるバッファに随時書き込んで
Java側はポーリングするだけ、とかならメソッド呼び出しの負荷は減るかもしらん。
ただし、取りこぼしが考えられるので完全な連続性は保証できないし
同期処理とかを考えると取り扱いはかなり面倒になるし、
同期処理は下手すりゃネイティブメソッド呼び出しよりも高くつく可能性もある。
自分の技術力とか、CPU使用率がどれだけ必要なのかとかを良く考えた方が良いかも。

ま、裏技的な事をする前にネイティブメソッド呼び出しが
本当にボトルネックになってるのか検証する事をオススメするけどね。
何の検証もせずに、ネイティブメソッド呼び出しが遅いとか聞きかじった程度なら、
上記みたいな事をしても無駄だと思う。

483 名前:デフォルトの名無しさん mailto:sage [2006/09/10(日) 12:57:34 ]
>>481
dllでOSのスレッド作って、そのスレッドでjvmにアタッチして、
whileループ回しながら、適時、Listener経由でコールバック。

484 名前:デフォルトの名無しさん mailto:sage [2006/09/11(月) 01:39:27 ]
>>483
結局ネイティブ->Javaのメソッド呼び出しのコストが必要になるけどね。



485 名前:名無しさん@お腹いっぱい。 [2006/12/07(木) 15:12:29 ]
関連wiki
wiki.ninki.org/wiki.cgi?p=%a1%fa%a4%aa%c1%b0%a4%e9Java%a4%cfJNI%a4%c7%c1%c8%a4%e2%a4%a6%a4%bc%a1%fa


486 名前:デフォルトの名無しさん [2006/12/07(木) 19:57:23 ]
Cで書いたプログラム上でJVMを生成して、クラスをロードしようと思ってるんだけど、
Invocation APIでJVMを作るサンプルができたので、デバッグメッセージをファイルにだそうとしたら、セグメンテーションフォルトで落ちるようになってしまった。
いろいろ削っていって、

FILE* f;

↑この一行があるかないかだけで、セグ(ryが起きるかどうかが変わるんだが、
これどう解決したらいいだろうか?


487 名前:デフォルトの名無しさん mailto:sage [2006/12/07(木) 22:19:52 ]
Java専用のCコンパイラがあったらなとは思う。
ソースコード一式セットしておけば
Antみたいのが走ってそのOS向けにビルドとか。

dllとかいちいち作らせるのも忍びない

488 名前:デフォルトの名無しさん [2007/04/22(日) 23:55:47 ]
 

489 名前:デフォルトの名無しさん mailto:sage [2007/05/26(土) 21:11:12 ]
Java Native Access (JNA): access native libraries with pure Java code.
https://jna.dev.java.net/
JNative, Java framework for DLL access for Windows and Linux
jnative.free.fr/SPIP-v1-8-3/
nlink: NLink - Native Library Linker:
https://nlink.dev.java.net/

490 名前:デフォルトの名無しさん mailto:sage [2007/05/26(土) 22:56:51 ]
JNIと何が違うの?

491 名前:デフォルトの名無しさん mailto:sage [2007/05/26(土) 22:58:03 ]
>>490
自分で一切ネイティブコード書かなくて良い点が違うんでは?

492 名前:デフォルトの名無しさん mailto:sage [2007/05/27(日) 00:12:37 ]
.NETでいうP/Invokeのようなもんか?

493 名前:デフォルトの名無しさん [2007/06/24(日) 11:08:18 ]
すみません。
JavaからFortranのプログラム呼ぶことって可能なのでしょうか?

計算処理はFortranでやってて、それをJavaから呼ぶ必要があるんですが。

494 名前:デフォルトの名無しさん mailto:sage [2007/06/24(日) 19:48:04 ]
ルーチン名がマングリングされないようにコンパイルすれば出来ると思う。
大文字に固定されるとか、末尾にアンダーが入るとかするなら
C言語でラッパを書けばいい。



495 名前:デフォルトの名無しさん [2007/07/27(金) 18:47:25 ]
Java側からCクラスオブジェクト丸ごと読み込んで、中のメソッド制御したいんですが、
こういう使い方ってJNIで出来るんでしょうか?

496 名前:デフォルトの名無しさん mailto:sage [2007/07/27(金) 20:58:38 ]
エスパー募集中

497 名前:デフォルトの名無しさん mailto:sage [2007/07/27(金) 21:44:17 ]
できる

498 名前:デフォルトの名無しさん [2007/07/30(月) 12:01:58 ]
jni使わないと、mmx, sseとか使えないんだね。

499 名前:デフォルトの名無しさん mailto:sage [2007/07/30(月) 14:34:39 ]
jniの呼び出しオーバーヘッドで、mmxとかのメリット吹き飛ぶ予感

500 名前:デフォルトの名無しさん mailto:sage [2007/07/30(月) 19:01:48 ]
それは気にし過ぎ。
2GのファイルとかにMMXするの考えてみて

501 名前:デフォルトの名無しさん mailto:sage [2007/07/30(月) 19:09:34 ]
MMX使っても、メソッド呼び出し1回で 2Gのファイル処理しないとペイしないのか。

502 名前:デフォルトの名無しさん mailto:sage [2007/07/31(火) 04:49:18 ]
比べる土俵が違うんじゃないか。
例えばMMXはJavaにはない機能なんだが、JNI使用しないとつかえないわけで。

503 名前:デフォルトの名無しさん mailto:sage [2007/07/31(火) 05:30:13 ]
いみわからん

504 名前:デフォルトの名無しさん mailto:sage [2007/07/31(火) 07:46:43 ]
>>503 おまえは あほか



505 名前:デフォルトの名無しさん mailto:sage [2007/07/31(火) 10:43:39 ]
java vmのソースも公開されたことだし、jitコンパイラをハックして
mmx/sse等を使うようにしてみるのも楽しいかもね!

506 名前:デフォルトの名無しさん mailto:sage [2007/07/31(火) 12:58:02 ]
>>502
>>504
速く処理を終わらせることが目的なのか、MMXを使うことが目的なのか。
大多数の人にとってはMMXは手段であって目的ではない。

507 名前:デフォルトの名無しさん mailto:sage [2007/07/31(火) 14:54:43 ]
>>503 おまえ MMY つかったことないだろ

508 名前:デフォルトの名無しさん mailto:sage [2007/08/02(木) 12:00:16 ]
>>506 おまえ MMZ つかったことないだろ

509 名前:デフォルトの名無しさん mailto:sage [2007/08/02(木) 19:16:27 ]
JNIの呼び出し、戻しって遅いしね。つかえね〜

510 名前:デフォルトの名無しさん mailto:sage [2007/08/02(木) 19:50:22 ]
MMWなら使った

511 名前:デフォルトの名無しさん mailto:sage [2007/08/02(木) 21:05:37 ]
なんと!

512 名前:デフォルトの名無しさん mailto:sage [2007/08/03(金) 08:27:36 ]
JNIのほうではmemcpy相当
Javaのほうではarraycopy相当

で1000万回やったけど、
native.dllのままで、8秒。
native.dllをcl /02 /GDで最適化して5秒。
arraycopy呼び出しは1秒。

JNIの関数呼び出し戻しって遅いよ。
どうにもならないだろうね。

513 名前:デフォルトの名無しさん mailto:sage [2007/08/03(金) 09:14:16 ]
関数呼び出し戻しの時間を測定するために、ちょっとDLL作って計ってみた。
public static native long callfunc(long q);
public static long callmeth(long q)

で、引数を何もしないで返すだけ。clは/Ot /GA
100 000 000(1億回)で、
3435 mill
290 mill
およそ10倍。呼び出し回数が異常に多いと、JNIは遅すぎ。

514 名前:デフォルトの名無しさん mailto:sage [2007/08/03(金) 09:17:11 ]
ああ、環境は、
windows 2000
jdk 1.6.0.1
cl vc++ 2005



515 名前:デフォルトの名無しさん mailto:sage [2007/08/03(金) 11:40:12 ]
JNIコールが遅いってのは、javaプログラマの常識。
呼び出しそのものが遅いってのもあるけど、JNI関数内がJVMからみて不透明なので、
最適化の阻害要因にもなる。
JNI使うのは、JVM経由ではサポートされないプラットフォーム固有のリソースを使うとか、
画像処理なり数値演算なり、CPUパワーに強く依存する処理を大きな単位でC/C++化したりする
ときぐらい。

516 名前:デフォルトの名無しさん [2007/08/03(金) 12:55:49 ]
でも呼び戻しが遅いから、その苦労は、相殺される。

517 名前:デフォルトの名無しさん mailto:sage [2007/08/03(金) 12:58:40 ]
>>500が言うみたいに、2Gとかのファイル処理じゃないと割に合わんね。

518 名前:デフォルトの名無しさん [2007/08/03(金) 13:11:32 ]
JVMでは、スクリプトばかりに日がさしているけど、
JNIが日の目を見るのはいつなのか・・

519 名前:デフォルトの名無しさん mailto:sage [2007/08/03(金) 16:09:45 ]
JVM内に取り込めばいいだけの話だろ
オープンソースなんだし

520 名前:デフォルトの名無しさん mailto:sage [2007/08/03(金) 16:13:36 ]
JVM内に取り込むって、どーゆー事?

521 名前:デフォルトの名無しさん mailto:sage [2007/08/03(金) 16:22:38 ]
>>517
それだけJavaも進化したものだとつくづく思う

522 名前:デフォルトの名無しさん mailto:sage [2007/08/04(土) 07:18:12 ]
>>520
JNIなしでネイティブを呼び出す

523 名前:デフォルトの名無しさん mailto:sage [2007/08/04(土) 09:43:46 ]
しかし、関数呼び出しがこれほど遅いとはおもわなんだ。
1億回も呼び出すことはないかもしれんが、100万回ぐらいは普通にあるだろ。
in.read()を100万回だと、1Gのファイル処理になるから。

524 名前:デフォルトの名無しさん mailto:sage [2007/08/04(土) 09:45:58 ]
100万で1Mファイルだった。



525 名前:デフォルトの名無しさん mailto:sage [2007/08/04(土) 12:01:59 ]
>>522
GC管理外にオブジェクト持ち出すための準備はJNIでなくても必要になるだろうし、
JITコンパイラがネイティブコードとJavaのコードを混ぜて最適化ってのも期待できないから
仮にJNIなしでネイティブ呼び出ししても、呼び出しコストが高くなるのは変わらんと思うよ。

期待できるのはJNIって名前が変わる事ぐらいか。

526 名前:デフォルトの名無しさん mailto:sage [2007/08/04(土) 12:03:27 ]
んなこたない。

527 名前:デフォルトの名無しさん mailto:sage [2007/08/04(土) 12:10:10 ]
>>523-524
そゆこと。

FileInputStream で1バイト読み込みの read() 連発すると滅茶苦茶遅くなるしね。

528 名前:デフォルトの名無しさん mailto:sage [2007/08/04(土) 14:06:31 ]
>>527
チマチマやったとしても、実際問題、OSの方でバッファされてるんじゃないか?

529 名前:デフォルトの名無しさん mailto:sage [2007/08/04(土) 14:09:29 ]
いや、JNIの呼び出しコストの話

530 名前:デフォルトの名無しさん mailto:sage [2007/08/04(土) 14:14:20 ]
>>525
例外を Java側にスローする際の後始末とかもあるし。

531 名前:デフォルトの名無しさん mailto:sage [2007/08/04(土) 14:49:16 ]
>>529 そうだった。

532 名前:デフォルトの名無しさん mailto:sage [2007/08/04(土) 14:51:07 ]
といっても、実際問題では2Gのファイル読み込むわけではないし、
むちゃくちゃ遅いって事はないだろ。せいぜいjpegで1,2秒まち。

533 名前:デフォルトの名無しさん mailto:sage [2007/08/04(土) 14:56:55 ]
べつにJavaじゃ無くても、ファイル読み込みはネイティブでもそれぐらい時間かかるし。

534 名前:デフォルトの名無しさん mailto:sage [2007/08/04(土) 15:03:09 ]
ファイル読み込みが遅いって言ってるんじゃなくて、
JNIの呼び出し回数を増やすと遅くなるって話なんだが。

FileInputStream#read() で 1バイトずつ読み込むのと
FileInputStream#read(byte[]) で 1024バイトずつ読むのとを比べたら
後者の方が圧倒的に速い。



535 名前:デフォルトの名無しさん mailto:sage [2007/08/04(土) 15:08:15 ]
ああ、わかってる。
ファイル読み込み(IO)は、Javaのアプリじゃなくて、ネイティブのアプリでやっても、
(1M)は1秒ぐらいかかるから、体感では変わらないってことがいいたかっただけ。

JNIはIOでは仕方なく使うことになるけど、
それよりcodecとかzipとかawtで活躍するんだろうと思う。

536 名前:デフォルトの名無しさん mailto:sage [2007/08/04(土) 15:20:24 ]
動画用codecとかawtもハードの機能使ったりする可能性考えるとネイティブにせざるを得ないでしょ。

zipも、ブートストラップクラスローダの初期段階では java.util.zipがロードできてない段階で
zipファイルからclassファイルを読み込む必要を考えると、
ネイティブでzlib相当のライブラリを持って無いとダメっぽい。

537 名前:デフォルトの名無しさん [2007/08/04(土) 15:26:41 ]
JavaはCより速いから、IO以外の場所でnativeを使う理由はない。

538 名前:デフォルトの名無しさん [2007/08/04(土) 15:28:11 ]
よって全てのライブラリは100% pure javaで作成されるべき。

539 名前:デフォルトの名無しさん mailto:sage [2007/08/04(土) 15:47:44 ]
>>536
最近はDRMとかあるから、ハードの機能だけじゃないかもしれんな。

540 名前:デフォルトの名無しさん [2007/08/04(土) 17:10:30 ]
JNIはJavaより速いかどうかで使う代物ではないな。
Hack専用。高次元技能者専用。したがってシャア専用。

541 名前:デフォルトの名無しさん [2007/08/04(土) 17:16:26 ]
JNIなんて仕方なく使うもんだろ?泥臭さの極致。

 バッドノウハウ

だな。

542 名前:デフォルトの名無しさん mailto:sage [2007/08/04(土) 17:21:42 ]
JAMの登場でそうも言ってられなくなるかもな。
jarやdllを埋め込めるようになるから、準標準VMのごとく
仕様を拡張してくる団体が現れても不思議じゃない。

543 名前:デフォルトの名無しさん mailto:sage [2007/08/04(土) 22:47:28 ]
>バッドノウハウ
どういう意味?

>JAMの登場でそうも言ってられなくなるかもな
JNIと関係ないと思うけど。

544 名前:デフォルトの名無しさん mailto:sage [2007/08/05(日) 00:21:22 ]
むちゃくちゃ関係あるだろ



545 名前:デフォルトの名無しさん mailto:sage [2007/08/05(日) 00:55:50 ]
つかadobe airがあるのに頑張る意味あんの?

546 名前:デフォルトの名無しさん mailto:sage [2007/08/05(日) 01:02:35 ]
Apollo自体に頑張る意味がないと思うんだが、それよりなぜJNIスレで?

547 名前:デフォルトの名無しさん mailto:sage [2007/08/05(日) 08:49:12 ]
>>541 君はJNIを一生障ることはないだろう

548 名前:デフォルトの名無しさん mailto:sage [2007/08/05(日) 09:39:57 ]
>>547
仕方なく使うだろ。

549 名前:デフォルトの名無しさん mailto:sage [2007/08/05(日) 13:11:00 ]
>>544 いまいちピンと来ない

550 名前:デフォルトの名無しさん mailto:sage [2007/08/05(日) 15:52:33 ]
JNIやると、.dllとか.soも理解しないと実質ダメだから敬遠される。

551 名前:デフォルトの名無しさん mailto:sage [2007/08/05(日) 19:05:14 ]
敬遠というか、JNIやるときにはDLLとかSO知らないと組めないことをやるわけだから・・・って書こうと思ったけど、DLL作るにしてもVBとかで手軽に書ければいいんだよな

552 名前:デフォルトの名無しさん mailto:sage [2007/08/06(月) 08:43:38 ]
mingwのgccでdllつくってる。clとかもそうだけど、コンパイラが吐くエラーメッセージが意味不明で泣きそうになる。javacの出来は優秀ってことが良く分かる。

553 名前:デフォルトの名無しさん mailto:sage [2007/08/06(月) 08:58:16 ]
cのリンク時に出るエラーで関数未定義とかで
どこにあるか分からないケースだと泣きそうになるな

javacも的外れなときはあるし
標準以外の機能を使い始めると
classpathが分からなかったり
色々苦労するよ

554 名前:デフォルトの名無しさん mailto:sage [2007/08/06(月) 09:49:40 ]
昔、メモリ搭載が128M程度のときに、1/2だと64M、1/4だと32Mなわけで
なんか身近な容量で実感があったけど、今のメモリ搭載が4Gであって、
1/2で2G、1/4で1Gで、メモリ確保としてやってることは変わらない。

2Gのメモリ確保って大きすぎるって感じはするけど、
当時はbmp,jpeg,mp3程度で10Mのファイルだったが、
今では、ISOファイルで700M、DVDで8Gとかのファイル読み込みになるんだから、
2G,3G程度のメモリ確保は普通にやるでしょ。



555 名前:デフォルトの名無しさん mailto:sage [2007/08/06(月) 10:46:37 ]
javaプロセス内で2G以上メモリ確保できるかなー

556 名前:デフォルトの名無しさん mailto:sage [2007/08/06(月) 12:38:19 ]
当然JavaVM外。

557 名前:デフォルトの名無しさん mailto:sage [2007/08/06(月) 13:11:13 ]
同一プロセス内じゃ無理じゃないかな

558 名前:デフォルトの名無しさん mailto:sage [2007/08/08(水) 13:54:06 ]
swigでラッパー自動的に吐き出して実装しようとしてるんすが、CStringとLPCTSTRとか、
各ポインタがSWIGTYPE_p_***となってしまってキャスト方法がわからんのですが、
JAVAでsuperclassとか意識しないでキャストする方法ありますか?

559 名前:デフォルトの名無しさん mailto:sage [2007/08/09(木) 13:12:53 ]
何をしたいのかよう分からん。

560 名前:デフォルトの名無しさん mailto:保守 [2007/11/18(日) 03:07:02 ]
>>489
ここで紹介されているものもJNI並のオーバーヘッドがあるのかな?
だれかベンチとった人いないかな?
たとえ内部でJIN使っているとしても、JINとパフォーマンス的に大差ないなら
バッドノウハウなJINを使うよりずっとよさげだ。


561 名前:560 mailto:sage [2007/11/18(日) 03:08:39 ]
JINって。。。吊(ry

562 名前:560 mailto:sage [2007/11/18(日) 03:13:34 ]
ついでに
Javaってスタックオーバーフローとかアウトオブメモリとかでもfinallyブロックの実行保障ってされてるの?

563 名前:デフォルトの名無しさん mailto:sage [2007/11/18(日) 04:13:29 ]
StackOverflowError や OutOfMemoryError を特別扱いする記述が
JLSには見当たらないから、他の例外と同レベルに保証されてると考えて良いと思うけど。

ただまぁ、finally節で間接的にでもインスタンス生成した場合
即刻 OutOfMemoryError で死ぬって可能性はある。

564 名前:デフォルトの名無しさん mailto:sage [2007/11/18(日) 04:27:18 ]
>>563
.NETだとこれらの非同期例外についてfinallyブロックの実行保障がされてなくって
ネイティブリソースを扱う場合はSafeHandle等を使うわけだけども
JNIではVMがよろしくやってくれちゃうって認識でおk?



565 名前:デフォルトの名無しさん mailto:sage [2007/11/18(日) 04:36:46 ]
>>564
JNIが何で出てくるのか判らん
>>563はVM内での話でしょ?

566 名前:デフォルトの名無しさん mailto:sage [2007/11/18(日) 04:37:07 ]
SafeHandleみたいな場合は、JNI使う側でなんとかしろって事になると思うけど。
っつか、OutOfMemoryError も StackOverflowError も関係ないね、それ。

567 名前:デフォルトの名無しさん mailto:sage [2007/11/18(日) 04:49:44 ]
>>566
JNIの呼び出しでJava側がハンドルを受け取ってまたJNIでそのハンドルを引数にして呼び出したり
ってことはないの?
その際、JNIからJavaへ受け渡す合間に非同期例外が発生してもハンドルを喪失しない保障がないとやばいべ

568 名前:デフォルトの名無しさん mailto:sage [2007/11/18(日) 11:41:44 ]
>>567
メソッド呼び出しの際にチェックされるから、
JNI呼び出し前に非同期例外が発生していても問題ない。

JNIメソッド内で非同期例外が出る場合ってのも、
例えば OutOfMemoryError が出る前に、
まず NewObject や New<Type>Array みたいなメソッド呼び出し自体が失敗するから、
失敗した時点でJNIメソッド内で責任を持ってハンドルを解放しないといけない。
自動的にはやってくれない。

569 名前:デフォルトの名無しさん mailto:sage [2007/11/18(日) 12:04:19 ]
>>566
っつか、SafeHandle みたいな話なら関係ないのは finally だわな。

オブジェクトを生成して戻り値でハンドルを返すようなメソッド内で
オブジェクト生成したのに非同期例外で中断、戻り値じゃなくて例外飛んできて、
生成したオブジェクトのハンドルが失われてるから
finallyブロックの実行が保障されてても、解放したりの後処理ができねーってのを
防ぐための仕組みでしょ、SafeHandle って。

570 名前:デフォルトの名無しさん [2007/11/18(日) 12:38:31 ]
すまん。JNIっていうのに興味あるんだけど、ピアソンエデュケーションの本を
立ち読みしてみたんだけど、いまいちよくわからんのだ。JNIっていうのができると
たとえばどんな事ができるんだい?

571 名前:デフォルトの名無しさん mailto:sage [2007/11/18(日) 15:19:24 ]
C言語で書かれたライブラリなどがJavaから使えたりします。

572 名前:デフォルトの名無しさん mailto:sage [2007/11/18(日) 15:27:10 ]
>>568
なるほど。
JNIメソッド内でハンドル受け渡しを保障して、finally節実行も保証されているなら問題なさげだね。

>>569
SafeHandleはハンドル取得->代入のアトミック性と
SafeHandle自身がクリーンナップコードをもっていてその実行が保障される仕組み
じゃないっけ?だからfinallyが実行されなくてもリソースの開放が保障される。
finally節の実行保障がないからSafeHandleを使うってことで関係ないってことはなくね?

573 名前:570 mailto:sage [2007/11/18(日) 23:07:02 ]
>>571 サンクス。なら、Windowsフォームつかって無理やりJNIプログラム作ってみるよ。

ありがとね。

574 名前:デフォルトの名無しさん mailto:sage [2008/02/29(金) 02:19:26 ]
C -> Java -> C みたいに変な感じでJNIを使いたいんだけど、
Java -> C のための loadLibrary() でDLLが見つからないんだ。

>>462 みたいなエラーが投げられてるみたいなんだ。
java.library.path で指定した場所にあるDLLなのに。

ちなみに、C -> Java の部分をなしにして、直接javaから
起動すると loadLibrary() できるんだ。

あと、sun.boot.library 上に置いてもうまくいくんだ。

JDK1.5.0_10 + Windows XPなんだけど、誰か何か知らない?



575 名前:デフォルトの名無しさん mailto:sage [2008/02/29(金) 22:59:06 ]
>>574
それ解決できないレベルが触らない方がいいものだよJNIは

576 名前:デフォルトの名無しさん mailto:sage [2008/03/09(日) 01:39:10 ]
JVMTI でツール作ってる。

JNI 部分(A)+Java 部分(B)と、テスト用の Java ター
ゲットプログラム(C)が用意してある。

起動時に指定されたクラスメソッドに対して
RedefineClass() 使って(B)のクラスのスタティックメ
ソッドを呼び出すバイトコードを inject してる。

で、(C) のクラスを指定すると期待通り動くんだけど、
java のライブラリクラスを指定すると (B) クラスの
NoClassDefFoundError になってしまう。

環境は Linux+JDK5 なんだけどこれってどうして?どう
したらいい?

ちなみに Java 歴一年です。

577 名前:デフォルトの名無しさん mailto:sage [2008/03/09(日) 01:56:29 ]
どうしても糞もNoClassDefFoundErrorだろ。
今時JNI使おうって奴はこんなレベルなんかね・・・

578 名前:576 mailto:sage [2008/03/09(日) 01:59:56 ]
>>577
実行環境は全く一緒、実行するプログラムも引数も全く一緒で、
inject してるバイトコードが参照してるクラスも一緒。
ターゲットプログラムのクラスからは見えるのに
ライブラクラスから見えないのはなんで?

579 名前:デフォルトの名無しさん mailto:sage [2008/03/09(日) 02:11:02 ]
クラスローダが違うとか?

580 名前:576 mailto:sage [2008/03/09(日) 02:40:45 ]
了解。ちょっと調べてみる。

581 名前:576 mailto:sage [2008/03/09(日) 03:49:36 ]
うーん、ちょっと手を入れてる暇がないなぁ。
当初の目的は果たしたし、とりあえずライブラリ側は
どうしても必要なら後から考える。

> 今時JNI使おうって奴はこんなレベルなんかね・・・

いや、これはもう本当にその通り。
JNI なんて触るより前に知っておくべきことだった。

582 名前:デフォルトの名無しさん [2008/07/22(火) 19:57:59 ]
 

583 名前:デフォルトの名無しさん [2008/07/22(火) 20:38:03 ]
TextSS


584 名前:デフォルトの名無しさん mailto:sage [2008/08/13(水) 22:30:08 ]
C++からJavaのnativeなメソッドに char* を返したいのだが、
jbyteArrayとかにしないとJava側で受け取れないかな?
char* のままで返せない?



585 名前:デフォルトの名無しさん mailto:sage [2008/08/13(水) 22:53:38 ]
>>584
せめて整数型にキャストするとかしないと無理。

586 名前:デフォルトの名無しさん mailto:sage [2008/08/13(水) 23:32:29 ]
>>584
っていうか char* を jbyteArray にどうやって変換するの?

587 名前:デフォルトの名無しさん mailto:sage [2008/08/13(水) 23:36:45 ]
NewDirectByteBufferという手も

588 名前:デフォルトの名無しさん mailto:sage [2008/08/13(水) 23:58:38 ]
そんなことできるんだ

589 名前:デフォルトの名無しさん mailto:sage [2008/08/14(木) 00:01:29 ]
>>587
馬鹿なおいらに具体的なサンプルコード書いてください、仏様。

590 名前:デフォルトの名無しさん mailto:sage [2008/08/14(木) 01:26:18 ]
こんな感じ?

#include <jni.h>
JNIEXPORT jobject JNICALL Java_Goodbye_getGoodbye(JNIEnv *env, jclass clazz) {
return (*env)->NewDirectByteBuffer(env, "goodbye", 7);
}

import java.nio.*;
public class Goodbye {
public static void main(String[] args) {
System.loadLibrary("goodbye");
ByteBuffer buffer = getGoodbye();
byte[] b = new byte[buffer.remaining()];
buffer.get(b);
System.out.println(new String(b));
}
private static native ByteBuffer getGoodbye();
}

591 名前:デフォルトの名無しさん mailto:sage [2008/08/14(木) 08:30:15 ]
>>590
NewDirectByteBuffer って読み書き両用にしかできないと思ったが、
C/C++ の文字列リテラルって書き込みして良いんだっけか?

592 名前:デフォルトの名無しさん mailto:sage [2008/08/14(木) 09:27:52 ]
え、read onlyのdirect bufferって作れないの

593 名前:デフォルトの名無しさん mailto:sage [2008/08/14(木) 09:46:01 ]
asReadOnlyBuffer() すりゃ読み込み専用にできるけど、
NewDirectByteBuffer した直後は書き込めるよね。

594 名前:デフォルトの名無しさん mailto:sage [2008/08/14(木) 09:51:42 ]
あぁ、asReadOnlyBuffer しても読み込み専用のビュー返すだけで
NewDirectByteBuffer で作成したバッファ自体が読み込み専用になるわけじゃないんで。



595 名前:デフォルトの名無しさん mailto:sage [2008/08/14(木) 10:10:12 ]
>>590だけならNewStringとかNewStringUTFした方が楽じゃね

NewDirectByteBufferに自前で確保したメモリ渡す時って
誰がどのタイミングでメモリ解放すりゃいいんだか良くわからんし
メモリ解放用のコールバック関数渡すわけでもないみたいだし
NewDirectByteBufferってメモリマップドI/Oみたいな
解放の必要がないアドレス渡すためにあるんじゃ

596 名前:590 mailto:sage [2008/08/14(木) 12:11:38 ]
サンプル欲しいっていうから書いただけなんだからねっ
使い方に問題あるのは百も承知

>>595
一度放ったByteBufferを無効に出来ないってのがネックなんだよな
参照が切れてGCに回収されるのをWeakReferenceで待ってから解放するしかない

597 名前:デフォルトの名無しさん mailto:sage [2008/08/16(土) 21:24:14 ]
問題の少ない使い方するために記述容易性なくなるんなら
素直に byte[] とか使った方が早いんじゃねーかと思わなくも無い。

598 名前:デフォルトの名無しさん [2008/08/17(日) 11:27:03 ]
>>598
imepita.jp/20080726/075540


599 名前:デフォルトの名無しさん mailto:sage [2008/09/02(火) 07:29:06 ]
>>596
よく頑張った。参考になった。

600 名前:デフォルトの名無しさん mailto:sage [2008/09/13(土) 00:46:19 ]
ああああ デバッグ面倒くせええええ

601 名前:デフォルトの名無しさん [2008/10/07(火) 08:19:19 ]
>>401
  ∧ ∧ 彡
ミ ( ^ω^ )っ 彡
  O ノ タタタタ…スゲー
 ミ| (_) 彡
ミ し´ 彡


602 名前:デフォルトの名無しさん [2008/11/06(木) 19:01:15 ]
現在とあるマイナーDBMSをJavaから利用するために、DLLで配布された
ドライバをSWIGでラップしてJDBC環境もどきを実現するライブラリを開発
しています。

現在開発環境上ではちゃんと動作するのですが、作成したライブラリを
ドライバのDLLやJNIのDLLと一緒にJARとしてパッケージングして配布
しても、配布先で動作させる事が出来ません。

過去レスではJARにネイティブライブラリを組み込むのは無理、との回答
でしたが、Googleで調べてみるとJARにdllやsoを組み込むには、

「manifest.cfにBundle-NativeCodeなる項目を追加してファイル名を列挙」

すれば良い、みたいな情報を見つけました。が、これでも無理でした。
これはもう無かった事になっているのでしょうか?

603 名前:デフォルトの名無しさん mailto:sage [2008/11/06(木) 19:21:33 ]
Bundle- って OSGi では?
普通の Java アプリケーションには無意味なプロパティ

604 名前:デフォルトの名無しさん [2008/11/13(木) 00:50:18 ]
JNI で呼び出すDLL(C++でコーディング)で、

int* src = (int *)env->GetPrimitiveArrayCritical()

__m128i * s128 = (__m128i *)src;
__m128i const128 = _mm_set1_epi32(1);
*s128 = _mm_sub_epi32(*s128, const128);


みたいなことするとVMがクラッシュしてくれて泣きそうです。
DLL側でメモリリークしてるとクラッシュするんで、それと同じかなぁと
おもっとるんですが、
GetPrimitiveArrayCritical じゃなくて、普通に
_mm_malloc() して確保した場合は問題ないんですよねぇ。

JNI の先で SIMD 命令使ったことある猛者はおらんですか。



605 名前:デフォルトの名無しさん mailto:sage [2008/11/13(木) 02:02:15 ]
クラッシュしたときの例外コードは?

_mm_malloc()で動作するということはalignじゃないの?

606 名前:デフォルトの名無しさん [2008/11/24(月) 14:43:19 ]
>>604
どのコードでクラッシュするんだよ?
そのコードの中か?
それとも、そのコード抜けて、しばらくたってからか?

後者なら、おまえの書いたC++コード中か?それとも、JavaVMのコード中か?

607 名前:デフォルトの名無しさん [2008/11/24(月) 14:46:17 ]
つか、GetPrimitiveArrayCriticalって、Javaヒープの中身を指してる
ポインタを返すと思うから、下手な操作すると、Javaヒープぶっ壊して
簡単に死ぬぜお

608 名前:デフォルトの名無しさん mailto:sage [2009/01/02(金) 03:49:02 ]
SSEなんですけど、DLLが完成してループでテストすると1500回以内だと問題なんですが、それ以上だとするとJVMが落ちます。
mingwでsseなんですが、builtin_addpsのところで落ちてるみたいで、さらに、alinged_mallocつかっても無理でした。
2−3日調べてみましたが解決法はないみたいなんで、面倒だしSIMDについてはIntelにはもう全く期待しないでGPUやOpenGLの方でやります。
せっかくfftとか画像処理で使おうと思ってたんですけど、だれかJNIでSSE使ってる人いないですか?

609 名前:デフォルトの名無しさん mailto:sage [2009/01/02(金) 03:54:04 ]
このコアダンプももう見飽きたw

# EXCEPTION_ACCESS_VIOLATION (0xc0000005) at pc=0x61e012bb, pid=1668, tid=1888
#
# Java VM: Java HotSpot(TM) Client VM (11.0-b15 mixed mode, sharing windows-x86)
# Problematic frame:
# C [sse.dll+0x12bb]

Current thread (0x002b7400): JavaThread "main" [_thread_in_native, id=1888, stack(0x00900000,0x00950000)]

siginfo: ExceptionCode=0xc0000005, reading address 0xffffffff

Registers:
EAX=0x00000000, EBX=0x26947e88, ECX=0x002b7a98, EDX=0x00000004
ESP=0x0094fbb8, EBP=0x0094fc00, ESI=0x0094fc2c, EDI=0x002b7400
EIP=0x61e012bb, EFLAGS=0x00010206

Top of Stack: (sp=0x0094fbb8)
0x0094fbb8: 002b7400 0094fc44 00000000 00000004
0x0094fbc8: 0094fbd8 47012a00 00a06a48 00a06fda
0x0094fbd8: c2040000 c2b00000 c2c60000 41b00000
0x0094fbe8: c7417200 c800f880 c8111580 47012a00
0x0094fbf8: 00989e07 0094fbfc 0094fc38 00a0926b
0x0094fc08: 002b7514 0094fc2c 0094fc24 00000000
0x0094fc18: 00000004 0094fc44 00000000 2298a768
0x0094fc28: 00988069 269483a8 2298a788 00000004

Instructions: (pc=0x61e012bb)
0x61e012ab: 45 08 89 04 24 8b 82 34 03 00 00 ff d0 83 ec 14
0x61e012bb: 0f 28 45 e8 0f 58 45 d8 0f 29 45 e8 8b 45 08 8b

610 名前:デフォルトの名無しさん mailto:sage [2009/01/03(土) 13:09:32 ]
sse命令を実行してるところ「だけ」コメントアウトしてみてはいかが
(メモリ確保などはそのままで)

それでも落ちるならsunに通報したほうがいいと思う

611 名前:デフォルトの名無しさん [2009/01/03(土) 15:51:08 ]
>>609
sse.dll+0x12bbで落ちてるって出てるんだから、そこ逆アセンブルして解析しろや。

612 名前:デフォルトの名無しさん mailto:sage [2009/01/03(土) 23:37:43 ]
sseつかっても結局メインメモリとのIOでアドバンテージも台無しになるから、xmmがfloat*4で8本程度だとあってもなくてもどうでもいいんだろうね。
一応cの方でベンチとってみたけど、fpuとsseでは1.3-1.8倍速くなる程度の開き(movapsつかうsseに有利なやつ)しかなかったから、
特殊な用途でもなんでもないのに、この程度でバグが出るならほっとくかな。
みんなfpuユニットの方使っててjvmでsseユニットを使うって需要がないんだろうな。

>>611
普通の用途でテストしてるのにバグってる(落ちる)ようなものは、残念ですけど使うつもりはありません。
それに、逆アセンブルして解析してバグ取りするのは私の仕事じゃないしw

613 名前:デフォルトの名無しさん mailto:sage [2009/01/04(日) 01:34:02 ]
一気にボルテージが上がったな

614 名前:デフォルトの名無しさん mailto:sage [2009/01/04(日) 12:21:45 ]
自分の書いたテストプログラムがバグっているのに、それを他人のせいにするキチガイがいるスレはここですか?



615 名前:デフォルトの名無しさん mailto:sage [2009/01/04(日) 14:46:27 ]
ソースコードを晒してくれればいじりようがあるんだが
今のままだと彼の妄言と区別しようがない

616 名前:デフォルトの名無しさん mailto:sage [2009/01/04(日) 17:36:25 ]
mingwでsseなんでだいぶ資料が少ないからついてこれる人がいるか心配なんですけどw
java側でループのテストして1−1500回のループは通るのですがそれ以降はJVMが落ちて、この[1]から[2]の間でバイオレンスらしいです。
それとjfloat a[4]としてますが、型の宣言方法はいろいろあってそれぞれ試してみたんですけど、どうもbuiltin loadups, addpsの方が問題みたいでした。
addss のスカラー版はループテストは完了していて問題ないです。
まだ敷居が高いですけど、もしsseが使えてライブラリ化できるとjavaで画象処理とかエンコとかストリーム・ライブとかが少しは早くなるんじゃないでしょうか。

JNIEXPORT void JNICALL xxx_Lsse_add_1ps
(JNIEnv *env, jclass clj, jfloatArray dstj, jint ix1, jint cnt, jfloatArray srcj, jint ix2)
{

typedef jfloat v4sf __attribute__ ((vector_size(16))) __attribute__((aligned(16)));

jfloat adst[4],asrc[4];
v4sf d1,s1;

if (cnt<0 || cnt>=5) return;

(*env)->GetFloatArrayRegion(env, dstj, ix1, cnt, adst);
(*env)->GetFloatArrayRegion(env, srcj, ix2, cnt, asrc);

printf(" [1]s%d", global_loop++);
d1=__builtin_ia32_loadups (adst);
s1=__builtin_ia32_loadups (asrc);

printf(" [2]");
d1=__builtin_ia32_addps (d1,s1);
__builtin_ia32_storeups (adst,d1);

printf(" [3]");
(*env)->SetFloatArrayRegion(env, dstj, ix1, cnt, adst);
}


617 名前:デフォルトの名無しさん mailto:sage [2009/01/04(日) 18:37:35 ]
関数の仕様が分からないのは置いておくとして、
cntの値として0〜3限定でなく、4がおkというのが気持ち悪くね?
(*env)->GetFloatArrayRegion(〜)の時点でスタック壊れるだろ。caller側がたまたまcnt >= 0 && cnt < 4を保証してたら問題は顕在化しないだろうが。

話題としては逸れるが、このfloat4つ単位でJNI呼び出しちゃうという仕様はコスト掛けすぎ。pure Javaで書いたほうが10倍速いと予想する。

618 名前:デフォルトの名無しさん mailto:sage [2009/01/04(日) 18:55:22 ]
Java側のコードも頼む

619 名前:デフォルトの名無しさん mailto:sage [2009/01/04(日) 18:58:28 ]
やっぱりついて来れる奴はいないか。
ま、せいぜいWebで資料(英語も)あさりでもしてバグ探してみてよ。


620 名前:デフォルトの名無しさん [2009/01/04(日) 19:02:47 ]
>>617
おまえの方が頭バグってんじゃねーの?w

621 名前:デフォルトの名無しさん [2009/01/04(日) 22:33:37 ]
負荷試験のコードに向かって「コスト掛けすぎ」とか、なんという言いがかり。



622 名前:デフォルトの名無しさん mailto:sage [2009/01/04(日) 23:37:49 ]
なんの負荷はかってんのか、という問題では

623 名前:デフォルトの名無しさん mailto:sage [2009/01/04(日) 23:51:05 ]
1500の原因が呼び出し側にある気がするが
呼び出し側のコードがないので
今のままだと彼の妄言と区別しようがない

624 名前:デフォルトの名無しさん mailto:sage [2009/01/05(月) 00:07:22 ]
繰り返し呼ぶとJITコンパイラが動くんだけど、その回数がclient vmだと1500回だってさ。

-XX:CompileThreshold

java.sun.com/javase/technologies/hotspot/vmoptions.jsp

1000回とかにして落ちる回数が変わったらこれかもな。

今回の件にどう絡んでるかわからん。
native method自体はJITコンパイル対象外だし。
スタックポインタの16bytes alignがズレてる可能性はあるかな。

adstやasrcのアドレスをprintfしてみるといいかも。

ま、>>616 にこれが理解できればの話だけど・・・



625 名前:デフォルトの名無しさん mailto:sage [2009/01/05(月) 00:49:38 ]
追加

使ってるgcc(mingwってgccだよね)のバージョンは?
こんなんあったぞ
gcc.gnu.org/ml/gcc-prs/2003-05/msg00244.html

>>609 の落ちた場所のコードってmovapsじゃなくてmovupsじゃないか?
んでアドレスが16bytes alignされてない気がする
ds9a.nl/gcc-simd/example.html
を"0f 28 45 e8"で検索すると例がある

>mingwでsseなんでだいぶ資料が少ないからついてこれる人がいるか心配なんですけどw

この程度でパニクってるお前の低脳さが心配だよw
レベル低過ぎw

626 名前:デフォルトの名無しさん mailto:sage [2009/01/05(月) 01:13:27 ]
デバッグご苦労。

627 名前:デフォルトの名無しさん mailto:sage [2009/01/05(月) 01:50:17 ]
素直に馬鹿はJNIなんて触るなっていっておけばいい物を・・・やさしいな

628 名前:デフォルトの名無しさん mailto:sage [2009/01/05(月) 01:55:00 ]
>>624
gcc (GCC) 3.4.2 (mingw-special)
Copyright (C) 2004 Free Software Foundation, Inc.

gcc のそれは最適化すると勝手にアドレス替えちゃうって言うのじゃなかったか(特にスタックにある位置とasm("")のときも)。
スタックの話が出ると思ってたけど、ヒープ・メモリalligned_malloc(16, sizeof (jfloat)*4)でも
1500回目で落ちるからあまり関係ない感じはする。(1500回以内は正常復帰であることが説明できない)。
そうするとjvm.dllの仕様なのかもな。1500を増やしても解決できるわけではないし、server vmにするわけでもないしなぁ。

それとJava側のコードとか普通に想像できるのしか使ってない。
何ていうか、普通に使うこの程度の用途でこんなバクが出てるんじゃ、Cやコンパイラ仕様に精通してないと全く刃が立たないし、
そもそもJavaから入った奴なんかチンプンカンプンでsimdなんかやる気なくなるだろうwところで、他の人は同じバグでないの?

long nowtime;

float[] fa={1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,}, fb=new float[fa.length];

nowtime=System.currentTimeMillis();
for (int k=count; k-->0;){
ベクタライズ計算のあれ♪(fa,0,4,fb,0);
}
nowtime=System.currentTimeMillis()-nowtime;


629 名前:デフォルトの名無しさん mailto:sage [2009/01/05(月) 02:08:24 ]
未だに>>617みたいな分かてないトウシロもいるから書いておくけど、
JNIは「使うとアプリが速くなる」とか「速くしたいから」JNI使うとか言う代物ではないよ。

SUNの英語サイトでもさんざん書いてあるんだけど、Java/jvmだけでは実現できない機能への「アクセス」が目的で
アプリの速度とか機能の向上が目的なAPIではないよ。
例えばwin32apiとかsse,gpuとかのネイティブ機能を使うには唯一JNIを使うしかないってこと。
dot netだとこのへんもdot net frameworkに組み込んでunsafeとかで実現してるけど(winだけ)、j
vmは同じことをJNIのAPIで実現してる。

それからasmとかじゃないただのネイティブ・アクセスならこっちの方でライブラリ・パッケージ化されてるから、少しは敷居が低くなった。
たぶんwin32apiとか使う人はこれで事足りるんじゃないか?
en.wikipedia.org/wiki/Java_Native_Access


630 名前:デフォルトの名無しさん mailto:sage [2009/01/05(月) 02:24:48 ]
つまりjvm.dllの仕様とかgccのビルトイン関数の仕様が原因だと、ユーザレベルではどうしようもできないから解決法はない。
それに、この程度の利用方法でバグってるならSIMDは需要すらないってことだとから、人柱になるつもりもないな。
asmを直接使ってasmに神経使うつもりもないし。
C関数_mm_add_psのほうも使ってみるけど、もうIntelのSSEには期待してないからどうでもいいけど。

631 名前:デフォルトの名無しさん mailto:sage [2009/01/05(月) 03:05:22 ]
はあ・・・

オプションを1000にしたら落ちるまでの回数も1000になりましたか?

低脳君はこれだから・・・

632 名前:デフォルトの名無しさん mailto:sage [2009/01/05(月) 03:10:27 ]
>>627
こういう性分でな。

ま、低脳君のためにやってるわけではないので。
誰か(低脳君を除く)のお役に立てれば幸い。

633 名前:デフォルトの名無しさん mailto:sage [2009/01/05(月) 06:41:26 ]
JNIを呼ぶメソッドをHotSpotコンパイラの対象外に設定すればいいだけの話。

634 名前:デフォルトの名無しさん mailto:sage [2009/01/05(月) 09:37:02 ]
JNIはもともとHotSpot対象外だよ。何いってのこのオッサン



635 名前:デフォルトの名無しさん mailto:sage [2009/01/05(月) 10:03:47 ]
>>633
HotSpotですけど、インタプリタモードで全体のon/offは出来るけどピンポイントでメソッド単位では出来ないでしょ。
それともjava/javacでそういうオプションがあるんですか?
JNI FAQとかhotspot optionsを眺めてみたんですけど、そういうのはないみたいですよ。

一応 -serverでは大丈夫みたいなんで、たぶんhotなコードでHotSpotが効いてるのか、もしくは
FAQにもあったんだんですけどSSE使ってる最中のGC起動でどうとか言うバグ(GCがらみ)と思います。
つまりgccや私のコードでなくjvmのバグってことです。

636 名前:デフォルトの名無しさん mailto:sage [2009/01/05(月) 11:59:45 ]
つ.hotspot_compilerファイル
tp://java.sun.com/javase/6/webnotes/trouble/TSG-VM/html/crashes.html#gbyzd

>>634
お前みたいな低脳見てるとイライラするわ。一生ロムってろ。

637 名前:デフォルトの名無しさん mailto:sage [2009/01/05(月) 12:39:02 ]
おいおい、それ
Note - The .hotspot_compiler file is an unsupported interface. It is documented here solely
for the purposes of troubleshooting and finding a temporary workaround.

とか書いてあるけど、中の人向けでやばいんじゃないの?
ていうかこれ、-XXオプションよりもSUNネイティブじゃんw
もしMSだったらそんな文書はます存在(公表)しないんじゃないのかと思う。「MS仕様です!」とかの域ww


638 名前:デフォルトの名無しさん mailto:sage [2009/01/05(月) 13:02:43 ]
RIAにC並みの性能をもたらす次世代のMozilla JavaScriptエンジン
www.infoq.com/jp/news/2008/09/tracemonkey

hotspot調べてたらこんな記事があったけどjvmではどうですか?
ざっと読んだところこの手法は、メソッドじゃなくてブロック単位でアスペクト切り替えみたいだけど、たぶん次世代な感じです。

それと .hotspot_compiler 使ってループテストは無事完了しました。
しかしこれではあまりにコアすぎるので他の方法でメソッド単位・クラス単位でJITコンパイル無効とかないですか?

よく考えると、JITコンパイルされようがなんだろうが、コードにバグがあるわけじゃなくてJVMの機構の問題なんで、
このような一時しのぎに頼らざる得ないのはおかしな話ですよね。awt.Canvas::paintとかどうしてるんでしょうか。

native funcやnative asmのret address がgcとかのデータ領域配置換えとかJITネイティブコンパイルによってコードのアドレスが変わって、ret先がずれてるってことなのかなと思う。
もうこのあたりはコアすぎて専門家か職人じゃなきゃ無理でしょ。

639 名前:デフォルトの名無しさん mailto:sage [2009/01/05(月) 13:07:16 ]
よってコード領域のアドレス


640 名前:デフォルトの名無しさん mailto:sage [2009/01/05(月) 23:02:17 ]
>>625
movupsならalignされてなくても問題ないのでは?

落ちた部分の
0x61e012bb: 0f 28 45 e8 0f 58 45 d8 0f 29 45 e8 8b 45 08 8b
を逆汗すると
MOVAPS XMM0,DQWORD PTR [EBP-18h]
ADDPS XMM0,DQWORD PTR [EBP-28h]
MOVAPS DQWORD PTR [EBP-18h],XMM0

EBPの値は>>609より、0x0094fc00なので、EBP-18h=0x0094fbe8。
ま、どう見ても16byte alignされてないな。
おしまい。

641 名前:デフォルトの名無しさん mailto:sage [2009/01/06(火) 06:31:38 ]
>>640
>movupsならalignされてなくても問題ないのでは?

といってみたり、

>ま、どう見ても16byte alignされてないな。

といってみたり、何をいいたいのかどうも良く分からないんだが。

もしかして、「俺ってアセンぶりぶりだぜ!!」ってこと?

642 名前:デフォルトの名無しさん mailto:sage [2009/01/08(木) 21:55:10 ]
バカホイホイスレ化してきました。

643 名前:デフォルトの名無しさん mailto:sage [2009/01/09(金) 19:25:03 ]
ここだけじゃなくてJava系スレは軒並みそうだけどな

644 名前:611 [2009/01/16(金) 01:06:01 ]
>>609から、明らかにネイティブコードでアクセス違反起してるのに、JITコンパイル
が云々とか、もうね。





645 名前:611 [2009/01/16(金) 01:23:15 ]
あ、悪い多分JITコンパイル関係あるわ。
JITコンパイルされて、呼び出し(Java)側のスタックフレームのサイズが変わったんだろ。
んで、インタプリタ実行中はたまたま>>640の言う、EBP-18hが16byteアラインになるEBP(SP)だったってことな。

つまり、>>616のローカル変数(jfloatかv4sf...SSEは素人なんて、どっちかわからん)を、16byteアライン
させれば直るだろ。
Cってアラインを強制する修飾子あるのかな?あるならそれ使って、
ないなら苦肉の策として、16byteのローカル変数突っ込めば、強制アラインされるから、多分直る。

jdouble aaaa; // ←追加
jfloat adst[4],asrc[4];
v4sf d1,s1;

あと利口なコンパイラだと、aaaaの使用点がないと、最適化で消しちゃうから適当な
仕様点作るとか。



646 名前:デフォルトの名無しさん mailto:sage [2009/01/23(金) 20:45:33 ]
C++(MFC)で作ったGUIプログラムをEcilpseのプラグインに移植しようとしています。
GUIだけをEclipseで作って、GUI以外は元のプログラムをそのまま使いたいのですが、
プラグインから元のプログラムをJNIで呼ぶのと、ソケット通信で呼ぶのでは
どちらが実装しやすいでしょうか?

647 名前:デフォルトの名無しさん mailto:sage [2009/01/23(金) 21:49:29 ]
ソケット通信部分が既に実装済みならソケット通信。
そうでなければ大して手間は変わらんと思う。

648 名前:デフォルトの名無しさん [2009/03/14(土) 03:56:14 ]
>>601
648ゲットオォオオォ!!!!!
  ∧∧
  (^ω^)
 cu_uっ バイーン
  彡
 / ̄ ̄\
 | ̄1 ̄|
 | ̄2 ̄|
 ̄ ̄ ̄ ̄ ̄ ̄


649 名前:デフォルトの名無しさん mailto:sage [2009/04/07(火) 02:00:47 ]
久しぶりに来たがまだあったのか。息の長ぇスレだな。

650 名前:デフォルトの名無しさん mailto:sage [2009/04/07(火) 10:05:03 ]
ある大企業の久しぶりの仕事が
JNI使ったシステムの手直しだった。
全部Javaにすればいいのに。

651 名前:デフォルトの名無しさん mailto:sage [2009/04/07(火) 10:50:08 ]
COBOL 使ってたりするとそうも行かんだろう。最後丸めで金額計算とか
やってると精度保証のテストだけでエラい事になるぞ。

652 名前:デフォルトの名無しさん mailto:sage [2009/04/07(火) 11:03:56 ]
なぜわかるw
今動いている奴の方が信頼性高いしな。

653 名前:デフォルトの名無しさん mailto:sage [2009/04/07(火) 13:35:54 ]
動いてるプログラムと、いまから作るプログラムでは、圧倒的に動いてるプログラムのほうが信頼性高いな。

654 名前:デフォルトの名無しさん mailto:sage [2009/04/08(水) 00:53:40 ]
丸ごとシステム入れ替える予算も出ない状況だしな。
JNIで既存システムのライブラリ使って徐々に移行していくしかない。



655 名前:デフォルトの名無しさん mailto:sage [2009/04/14(火) 21:20:40 ]
とりあえず JNI で他言語呼ぶにしてもアクセス違反に巻き込まれて Java の
プロセスまで落ちては困るので RMI くらいは噛ませるよう設計している。
あるいはコマンド起動にしてしまうか。

C/C++ も全然平気が売りな SE としてはとにかく JNI は回避されるので
寂しい限りです。

656 名前:デフォルトの名無しさん mailto:sage [2009/04/14(火) 23:36:39 ]
RPC経由でもCORBAエラー出まくるだけだと思う。

657 名前:デフォルトの名無しさん mailto:sage [2009/04/14(火) 23:57:23 ]
縮退運用やフェールセーフ措置がとれるのでよっぽどマシです。

658 名前:デフォルトの名無しさん mailto:sage [2009/04/15(水) 15:41:06 ]
ちゃんと動いてればね。
CORBAエラー出まくって鯖再起動させられる事多いよ。

659 名前:デフォルトの名無しさん mailto:sage [2009/04/15(水) 16:24:19 ]
ローカルの Java プロセス間で通信させる程度に IIOP なんか使わないよ。
JNI 使ってる部分を別プロセスに分離できれば良いだけなんだから。
新たにアプリケーションサーバ立てるような大げさな構成考えてない?

660 名前:デフォルトの名無しさん mailto:sage [2009/04/15(水) 17:51:57 ]
うちの場合はハードウェア対応とパフォーマンスのためにJNIだから、あんまり関係ないなぁ。

661 名前:デフォルトの名無しさん [2009/05/15(金) 08:08:30 ]
>>648
  サテト
  ∧∧
 (・ω・ )
 _| ⊃/(__
/ ヽ-(___/
 ̄ ̄ ̄ ̄ ̄ ̄


662 名前:デフォルトの名無しさん [2009/09/21(月) 11:06:08 ]
JNIは何をimportすればいいの?

663 名前:デフォルトの名無しさん mailto:sage [2009/09/21(月) 12:23:38 ]
おまえはimportが何なのかわかっていない
importは完全修飾クラス名を書くのが面倒なときにパッケージ名を省略するためのものであって
クラス名をすべて完全修飾で書くのならimport無しでもJavaのすべての機能を使える

664 名前:デフォルトの名無しさん mailto:sage [2009/09/21(月) 12:45:15 ]
インポートしても長いのに、まだ長くしようというのか。
嫌いじゃないが。
パス通して相対パスを使うよりも、常に絶対パス使えってことだろうけど。



665 名前:デフォルトの名無しさん mailto:sage [2009/09/21(月) 13:16:13 ]
どうせ書くのは宣言だけで、実際使う時は変数名になってるしね

オレはjava.ioとか付いてた方が意味がわかりやすいので、全部書いてるよ
書いてるというか、オートコンプリート機能で一覧から選んでるだけだけど

666 名前:デフォルトの名無しさん mailto:sage [2009/09/21(月) 14:10:59 ]
うわぁ…
Java利用者が減ったな

667 名前:デフォルトの名無しさん mailto:sage [2009/09/22(火) 18:45:21 ]
JNI使うような場面が減ったんだろう
まあいいことだ






[ 新着レスの取得/表示 (agate) ] / [ 携帯版 ]

前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧]( ´∀`)<168KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef