忍者ブログ
よくわからないことを調べて解説してみるブログ。

2024

1205
×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。

2012

1231
JVM.dllがクラッシュしまくった。
原因は実装コードが原因。

きっちりメソッドシグネチャとパラメータの型を合わせることでケアレスミスは解決する。

Double型 は、jobject

以下を例に注意点を。
これは、void PrintWriter#print(Double msg)というメッセージ出力メソッドを呼び出す流れ。
// クラス特定
jclass printWriter = env->FindClass("Lprottype/print/sample/PrintWriter;"); // クラス探索の際は必ず「;」を忘れずにこれだけでjvmはこける。
// メソッド特定
jmethodID printD = env->GetStaticMethodID(printWriter,"print","(Ljava/lang/Double;)V"); // シグネチャの1パラメータごとに「;」をいれた方が無難。
// データ型取得。
jclass jDouble = env->FindClass("Ljava/lang/Double;"); // クラス探索
// コンストラクタ取得。
jmethodID jDoubleIns = env->GetMethodID(jDouble,"<init>","(D)V"); // プリミティブ型のdoubleはD、参照型のDoubleは、Ljava/lang/Double。オートボクシングは行われないので、必ず引数の型に合わせること。
jdouble value = 1.2424;
// Double生成。
jobject valueObj = env->NewObject(jDouble,jDoubleIns,value);
// メソッド呼び出し。
env->CallStaticVoidMethod(printWriter,printD,valueObj);

という感じです。

参照型はstringを除きjobjectで渡す。プリミティブ型を引数に取るものは、対応するj~の型を使う。

あとは、JNIのドキュメント見ればいける。
 

拍手[0回]

PR

2012

1224
DLLをC++で作るとき、リンクの際にどうしてもJNI_GetDefaultJavaVMInitArgs、JNI_CreateJavaVMなどの
定義が読み込めなかった。
libファイルはしっかり参照できるようにしているにも関わらず。

どうやらこれらのJVM関数はエクスポートしないとうまく参照できないらしい。

EXPORTS

JNI_CreateJavaVM
JNI_GetDefaultJavaVMInitArgs

拍手[0回]

プロフィール
HN:
たんてーくん
性別:
非公開
フリーエリア
最新CM
[09/25 http://2017.bblbuy.com]
[09/24 http://www.japanform.com]
[09/23 http://www.japanform.com]
[09/22 http://www.japanform.com]
[09/21 http://2017.bblbuy.com]
ブログ内検索
忍者ブログ [PR]
* Template by TMP