1 名前:chinkasu [02/10/05 14:27] このすれ立てても一人としてレスはいるとはおもっちゃ ねーけどさ 2ちゃんのアフォにはこのレス荒らすことぐらいしかできないと 思ってるぜ お前らに期待を裏切るような書き込みをリクエストする
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使うような場面が減ったんだろう まあいいことだ