Android如何使用int和int []参数从Jni调用Java方法?

时间:2012-11-20 06:56:58

标签: android java-native-interface

我想使用int和int []参数从Jni代码调用Java方法。因为我已经Go-ogled并找到了以下样本。 Calling a java method from c++ in Android  它使用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";
}

1 个答案:

答案 0 :(得分:3)

我没有看到问题出现在哪里int[],但int应该很容易解决。

您需要查看GetMethodId()调用,特别是方法签名参数(最后一个)。 JNI规范提供了所有Type Signatures here的列表。当你最终也传递你的int数组时,这也应该对你有帮助。

所以我们现在可以看到你的签名是:

String messageMe(Integer text)

但你告诉JNI它是(Ljava/lang/String;)Ljava/lang/Integer;,它转化为:

java.lang.Integer messageMe(String text)

Type Signatures向我们显示int的签名只是I,因此您对GetMethodId()的论证应该是这样的:

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

我希望有所帮助。正如我之前所说,JNI不是最容易进入的,但答案确实都在Specification,你只需要看起来很难。

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

基本上,你几乎就在那里 - 你只是在签名中得到了参数并以错误的方式返回值。它应该是(<arguments>)<return type>。你也很容易错误地为Integer指定类,而不是基本类型。