我想使用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";
}
答案 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指定类,而不是基本类型。