从C ++ JNI获取Java类中的实例变量

时间:2013-10-17 14:46:02

标签: java c++ java-native-interface

美好的一天,抱歉,我只是JNI的一个菜鸟,如果这是一个相当愚蠢的问题,请耐心等待:D now现在使用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类中获取实例变量?似乎无法为此找到一个例子。还是非常直截了当?

2 个答案:

答案 0 :(得分: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);

答案 1 :(得分: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...