2012-10-03 30 views
0

我有一個問題,從jni到java類設置字符串,我寫了jni(在c)中,我想從jni設置一個字符串到java我確實喜歡這個設置從c jni到java的字符串

jclass cls; 
jmethodID mid; 

/* cls = (*env)->GetObjectClass(env, obj); */ 
cls = (*env)->FindClass (env,"com/example/lsextractor/LSCore"); 
jobject objRet = (*env)->AllocObject(env,cls); 
jstring estr = (jstring)(*env)->NewStringUTF(env,(char*)"Hello"); 
mid = (*env)->GetMethodID(env, cls, "setTemplate","(Ljava/lang/String;)V"); 
(*env)->CallObjectMethod(env,objRet,mid,estr); 

return (jint)1; 

但這種方法是行不通的,我不能從我的課得到的字符串,但我可以能夠從我的java類訪問所有其他方法我不能從JNI到Java設置字符串做有什麼想法要做到這一點, 這是我的課

public byte[] getimage() 
    { 
     return this.Image; 
    } 
    public void setimage(byte[] rawImg) 
    { 
     this.Image=rawImg; 
    } 
    public String getTemplate() 
    { 
     return this.Template; 
    } 
    public void setTemplate(String Tmp) 
    { 
     this.Template = Tmp; 
    } 
    static 
    { 
    System.loadLibrary("test"); 
    } 
+0

用句子分解你的問題以獲得更好的可讀性。描述你觀察到的行爲以及預期的行爲。 –

回答

0

首先,你不應該使用AllocObject由於n o將使用該函數調用構造函數。

試試這個:

mid = (*env)->GetMethodID(env, cls, "<init>", "()V"); 
jobject objRet = (*env)->NewObject(env, cls, mid); 

這會給你一個初始化的對象。


第二個問題是,你在呼喚CallObjectMethod

正確的方法調用是:

(*env)->CallVoidMethod(env, objRet, mid, estr); 

這是因爲功能的Void部分是返回類型。您的電話嘗試調用返回Object的方法。


AllocObject

jobject AllocObject(JNIEnv *env, jclass clazz);

分配一個新的Java對象而不調用任何的構造函數的對象。返回對象的引用。