[表示 : 全て 最新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ちゃんのアフォにはこのレス荒らすことぐらいしかできないと
思ってるぜ
お前らに期待を裏切るような書き込みをリクエストする


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のエラーの原因を調べればいいんじゃないの






[ 続きを読む ] / [ 携帯版 ]

前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