2012-10-03 34 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对象而不调用任何的构造函数的对象。返回对象的引用。