设置从c jni到java的字符串

时间:2012-10-03 07:08:22

标签: java c java-native-interface jnienv

我有一个问题,从jni到java类设置一个字符串,我写了jni(在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"); 
    }

1 个答案:

答案 0 :(得分:0)

首先,您不应该使用AllocObject,因为不会使用该函数调用构造函数。

请改为尝试:

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