tueda様
早速のお返事ありがとうございます!
ご指摘の通りの修正で、無事起動を確認できました。
その上で、何点かご質問させて頂いて宜しいでしょうか?
> ×:(*env)->FindClass(env,"com.example.hellojni.HelloJni");
> ○:(*env)->FindClass(env,"com/example/hellojni/HelloJni");
> あとFindClass()はシグネチャを間違えやすいので、
> GetObjectClass()を使ったほうが良いと思います。
他のサンプルでは、ピリオド指定になっていたので、ピリオドにしておりましたが、これは
どこかのバージョンで仕様が変わったと認識すれば宜しいでしょうか?(NDK r5 だけでしょうか?)
あとご推奨の GetObjectClassについては、これからテストしてみたいと思います。
> ×:(*env)->CallIntMethod( env, jcCallback, mid, 200 );
> ○:(*env)->CallIntMethod( env, thiz, mid, 200 );
この部分で疑問が生まれたのですが、Find クラスで取得した jcCallback 変数を、GetMethodIDで利用していますが、
CallIntMethod( env, thiz, mid, 200 ); の部分では 引数のthizを利用しています。ということは、下記のよ
うな表現は可能でしょうか?
// jclass jcCallback = (*env)->FindClass(env,"com/example/hellojni/
HelloJni"); // コメントアウトしています。
jmethodID mid = (*env)->GetMethodID(env,thiz,"printMes","(I)I");
int ret = (*env)->CallIntMethod( env, thiz, mid, 200 );
もしダメだとすれば、jobject 定義と jclass 定義は、クラス定義とそのインスタンスの違いという認識で、インスタンスからは、メソッド
名
は取得出来ず、またクラスからはメソッドを呼べないという認識で宜しいでしょうか?(Javaも初心者で申し訳ありません)
(インスタンスからメソッドを呼べないのは、VMを通じた取得をしていないと認識でしょうか)
もし的外れな理解で、ご不快にさせてしまったらすみません。後学の為にアドバイス頂ければ幸いです。
> JNIについては1冊本が出ていてオススメです。
> 「JNI:Java Native Interfaceプログラミング―C/C++コードを用いたJavaアプリ
ありがとうございます!早速、amazon で探してみます。
ところで、今回のサンプルを作っていて疑問に思ったのですが、C側でグローバル変数として確保した部分を、別々のタイミングで
呼び出したJNIのC関数の両方で利用していた場合、.so 型で呼び出されるこの hello-jni.so はグローバル変数を利用した、データ共
有
は難しいと考え得た方が宜しいでしょうか?
もし、難しい仕組みであるとすれば、別にスレッドを立てて質問をさせて頂くかも知れません。
お忙しいところ、丁寧なご回答ありがとうございます。