0

我在将字符串从 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"); 
    }
4

1 回答 1

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


分配对象

jobject AllocObject(JNIEnv *env, jclass clazz);

分配一个新的 Java 对象,而不调用该对象的任何构造函数。返回对对象的引用。

于 2012-10-03T08:42:16.513 回答