1

こんにちは、申し訳ありませんが、JNI の初心者なので、ばかげた質問である場合はご容赦ください :D JNI を使用して C++ から Java クラスのメソッドを呼び出すには、次のようにします。

Java クラス:

public int getCount() {     
    return mCount; 
}

JNI:

JNIEXPORT void JNICALL
Java_com_example_init(JNIEnv* env, jobject obj, jint number)
{
    ...
    jclass Class = env->GetObjectClass(obj);
    jmethodID getCountMethodID = env->GetMethodID(Class,
                                                    "getCount", "()I");
    if (getCountMethodID == 0)
    {
        LOG("Function getCount() not found.");
        return;
    }
   Count = env->CallIntMethod(obj, getCountMethodID);
    ...
}

しかし、Java クラスからインスタンス変数を直接取得するにはどうすればよいでしょうか。これの例を見つけることができないようです。またはそれは非常に簡単ですか?

4

2 に答える 2

2

詳細については、JNI ドキュメントを参照してくださいhttp://docs.oracle.com/javase/6/docs/technotes/guides/jni/spec/functions.html#wp16536

次のメソッドを使用して、目的のインスタンス変数の jfieldID を jclass から取得します。

jfieldID GetFieldID(JNIEnv *env, jclass clazz, const char *name, const char *sig);

jfieldID を取得したら、次のメソッドを使用してオブジェクト インスタンス変数にアクセスできます。ただし、アクセスするフィールドのタイプを事前に知っておく必要があります。

NativeType Get<type>Field(JNIEnv *env, jobject obj, jfieldID fieldID);

于 2013-10-17T14:58:00.973 に答える
0

GetFieldID()フィールド ID を取得するために使用します。これを複数回、または複数のオブジェクトに対して行う場合は、毎回検索するのではなく、必ずそのフィールド ID をキャッシュしてください。次に、Get<type>Field()関数を使用してフィールドの値を取得します。

jfieldID field = env->GetFieldID(Class, "myCount", "I");  // "I" = int field
if (field == NULL)
    /* Handle error */;

jint myCount = env->GetIntField(obj, field);
// Use field value...
于 2013-10-17T14:58:50.960 に答える