0

int引数とint[]引数を使用してJniコードからJavaメソッドを呼び出したいと思います。そのために私はGo-ogledをして、次のサンプルを見つけました。 Androidのc++からjavaメソッドを呼び出す と、Stringパラメーターで正常に機能しました。しかし、intを試してみると、問題が発生しました。私を助けてください 。

JNIコード:

jstring Java_com_calljavafromjni_MainActivity_getJniString( JNIEnv* env, jobject obj){

    jstring jstr = (*env)->NewStringUTF(env, "RAJESH TEST from JNI ");
    jint sss=1111;
    jclass clazz = (*env)->FindClass(env, "com/calljavafromjni/MainActivity");


    jmethodID messageMe = (*env)->GetMethodID(env, clazz, "messageMe", "(Ljava/lang/String;)Ljava/lang/Integer;");
    jobject result = (*env)->CallObjectMethod(env, obj, messageMe, sss);

   const char* str = (*env)->GetStringUTFChars(env,(jstring) result, NULL); // should be released but what a heck, it's a tutorial :)
    printf("%s\n", str);

   return (*env)->NewStringUTF(env, str);


}

Javaコード

public String messageMe(Integer text) {
    System.out.println( "aaaaaaaaaaaaaaaa "+text);

    return "test";
}
4

1 に答える 1

3

どこでint[]問題が発生するのintかわかりませんが、簡単に解決できるはずです。

GetMethodId()呼び出し、特にメソッド シグネチャ引数 (最後の引数)を確認する必要があります。JNI 仕様では、すべてのタイプ シグネチャのリストがここに記載されています。これは、最終的に int 配列も渡すようになったときにも役立ちます。

したがって、現時点であなたの署名が次のようになっていることがわかります。

String messageMe(Integer text)

しかし、あなたはそれが次のようなものであるとJNIに伝えました(Ljava/lang/String;)Ljava/lang/Integer;

java.lang.Integer messageMe(String text)

型シグニチャは、 an のシグニチャが単純であることを示しているためintIの引数は次のGetMethodId()ようになります。

jmethodID messageMe = (*env)->GetMethodID(env, clazz, "messageMe", "(I)Ljava/lang/String;");

それが役立つことを願っています。前に言ったように、JNI は簡単に理解できるものではありませんが、答えはすべてSpecificationにあります。

編集:署名を修正しました。

基本的に、あなたはほとんどそこにいました-引数と戻り値を署名で間違った方法で取得しただけです。である必要があります(<arguments>)<return type>。また、プリミティブ型の代わりに Integer のクラスを指定するという簡単な間違いも犯しました。

于 2012-11-21T14:17:35.867 に答える