teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

2

誤記訂正

2017/04/07 07:47

投稿

KSwordOfHaste
KSwordOfHaste

スコア18404

answer CHANGED
@@ -27,7 +27,7 @@
27
27
  //(2)の処理
28
28
  jclass jsampleInit = env->FindClass("jp/co/sample/SampleInit");
29
29
  jfieldID var = env->GetFieldID(jsampleInit, "name", "Ljava/lang/String;");
30
- jstring jstr = (jstring)env->GetObjectField(jsampleInit, var);
30
+ jstring jstr = (jstring)env->GetObjectField(jelement, var);
31
31
  ```
32
32
 
33
33
  こうした質問の場合、以下も併せて明記すると質問者さんが何をしたいかがよりはっきりわかると思います。

1

訂正

2017/04/07 07:47

投稿

KSwordOfHaste
KSwordOfHaste

スコア18404

answer CHANGED
@@ -39,4 +39,10 @@
39
39
 
40
40
  JNIではjava.lang.String以外の全ての参照型のインスタンスは型jobjectとしてのみ使えます。jclassは特定のクラスとしてフィールドやメソッドにアクセスするために使いますが、その求め方は`env->FindClass("jp/co/sample/SampleInit")`のようにすべきと思います。
41
41
 
42
+ ---
43
+ 追記1:ここから
44
+ JNIの仕様を眺めていてもう一つ重要なjclassの求め方があることに気づきました。Java側でnativeメソッドがstaticと宣言されている場合、C++で定義された関数の第二引数にクラスオブジェクトが渡されます。ただし、そこに渡されるのはnativeメソッドを定義したクラスであって、引数に渡されるクラスと同じではありませんのでその点注意してください。
45
+ 追記1:ここまで
46
+
47
+ ---
42
48
  Class<?>のインスタンスをJNIへ渡せばjobject => jclassに変換してもよいのでしょうか・・・残念ながらそれができるかどうか自分には分かりません><