2013-10-17 43 views
1

好日子,對不起,在JNI中只是一個noob,所以請耐心等待,如果這是一個相當愚蠢的問題:D now用C++調用java類中的方法,使用JNI ,你可以這樣做:在C++中得到一個Java類的實例變量JNI

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

您可以參考JNI Docs獲取更多詳細信息http://docs.oracle.com/javase/6/docs/technotes/guides/jni/spec/functions.html#wp16536

使用以下的方法

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

從JCLASS獲取所期望的實例變量的jfieldID一旦你的jfieldID則可以使用下面的方法訪問對象實例變量。但是您需要事先知道您要訪問的字段的類型。

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

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... 
相關問題