よくわからないことを調べて解説してみるブログ。
2012
JVM.dllがクラッシュしまくった。
原因は実装コードが原因。
きっちりメソッドシグネチャとパラメータの型を合わせることでケアレスミスは解決する。
Double型 は、jobject
以下を例に注意点を。
これは、void PrintWriter#print(Double msg)というメッセージ出力メソッドを呼び出す流れ。
// クラス特定
原因は実装コードが原因。
きっちりメソッドシグネチャとパラメータの型を合わせることでケアレスミスは解決する。
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のドキュメント見ればいける。
という感じです。
参照型はstringを除きjobjectで渡す。プリミティブ型を引数に取るものは、対応するj~の型を使う。
あとは、JNIのドキュメント見ればいける。
PR
2012
プロフィール
HN:
たんてーくん
性別:
非公開
最新記事
(03/29)
(03/29)
(06/26)
(05/21)
(04/23)
カテゴリー
最新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]
ブログ内検索