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);

これにより、初期化されたオブジェクトが得られます。


2番目の問題は、あなたが電話していることですCallObjectMethod

正しいメソッド呼び出しは次のとおりです。

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

これはVoid、関数の一部が戻り値の型であるためです。を返すメソッドを呼び出そうとしましたObject


AllocObject

jobject AllocObject(JNIEnv *env, jclass clazz);

オブジェクトのコンストラクターを呼び出さずに、新しい Java オブジェクトを割り当てます。オブジェクトへの参照を返します。

于 2012-10-03T08:42:16.513 に答える