1

美好的一天,对不起,我只是 JNI 中的菜鸟,所以如果这是一个相当愚蠢的问题,请耐心等待:D 现在使用 JNI 从 C++ 调用 java 类中的方法,您可以这样做:

Java类:

public int getCount() {     
    return mCount; 
}

杰尼:

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

使用以下方法从 jclass 中获取所需实例变量的 jfieldID

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 回答