2014-06-13 219 views
2

我試圖寫在一個實例對象變量上的Java:JNI訪問對象的實例變量

public class Test { 
    public Test() { 
    System.load("path_lib"); 
    this.jni_result = 0; 
    } 

    public PrintVar() { 
    JniTest(); 
    System.out.println("jni_result: " + Long.toString(this.jni_result)); 
    } 

    private native long JniTest(); 
    private long jni_result; 
} 

在C代碼中,我創建了一個變量

static void 
SetErrorVariable(JNIEnv *env, jobject jobj, long error) { 
    /* Get a reference to jctf object's class */ 
    jclass TestClass = env->GetObjectClass(jobj); 

    /* Get the Field ID of the instance variables "jni_result" */ 
    jfieldID fidError = env->GetFieldID(TestClass, "jni_result", "J"); 

    /* Change the variable "jni_result" */ 
    jlong jerror = (jlong) error; 
    env->SetLongField(TestClass, fidError, jerror); 
} 

JNIEXPORT jlong JNICALL 
Java_Test_JniTest(JNIEnv *env, jobject jobj) { 
    SetErrorVariable(env, jobj, -5) 

    return (jlong) -5; 
} 

寫我可以閱讀功能返回JniTest時,我改變了C代碼的返回值,但是我不能改變這個變量,我閱讀了幾個JNI教程,但是我沒有找到其他方法來做到這一點,我在哪裏錯了?

+0

你如何初始化你的'env'? –

回答

6

要獲得fieldID,你需要通過類,這是你在這裏做什麼:

jfieldID fidError = env->GetFieldID(TestClass, "jni_result", "J"); 

要設置類的一個實例的領域,你需要傳遞的實例那個類,否則它怎麼知道該類的實例是如何設置的? TestClass是類,obj是類的一個實例。你正在傳遞TestClass。因此,改變這種:

env->SetLongField(TestClass, fidError, jerror); 

要這樣:

env->SetLongField(obj, fidError, jerror); 
2

我認爲你在寫env->SetLongField(TestClass, fidError, jerror);而不是env->SetLongField(jobj, fidError, jerror);時犯了一個錯字。

請問您是否確認,如果這樣就足夠了?