0

我想使用 int 和 int[] 参数从 Jni 代码中调用 Java 方法。为此,我进行了搜索并找到了以下示例。 在 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 的签名很int简单I,所以你的论点GetMethodId()应该是这样的:

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

我希望这会有所帮助。正如我之前所说,JNI 并不是最容易进入的东西,但答案确实都在Specification中,你只需要非常努力地看。

编辑:我更正了我的签名。

基本上,您几乎就在那里 - 您只是在签名中以错误的方式获得了参数和返回值。应该是(<arguments>)<return type>。您还犯了一个简单的错误,即为 Integer 指定类,而不是原始类型。

于 2012-11-21T14:17:35.867 回答