这是我的一些 Java 代码:
public class MainTest{
/*
...
*/
public native void invokeByCPlusPlus();
private void appendLine(String... strs){
for(String str : strs) {
System.out.println("get s : " + str);
}
}
}
当我在 Java 中调用 invokeByCPlusPlus() 方法时,我想使用 jni 调用我的 Java 方法“appendLine(String... strs)”:
extern "C" void
Java_com_hengye_jnitest_MainTest_invokeByCPlusPlus(JNIEnv *env, jobject instance) {
jclass clazz = env->GetObjectClass(instance);
jmethodID methodId = env->GetMethodID(clazz, "appendLine", "([Ljava/lang/String;)V");
jvalue values[2];
jvalue *val1 = new jvalue();
val1->l = env->NewStringUTF("invoke by C++ 1");
values[0] = *val1;
jvalue *val2 = new jvalue();
val2->l = env->NewStringUTF("invoke by C++ 2");
values[1] = *val2;
env->CallVoidMethodA(instance, methodId, values);
return;
}
然后我收到一个错误: JNI 错误:尝试将 java.lang.String 的实例作为参数 1 传递给 void com.hengye.ndktest.MainTest.appendLine(java.lang.String[])
只有我像这样声明appendLine方法,代码才能正常运行:
private void appendLine(String str1, String str2){
System.out.print(str1 + str2);
}
如何解决这个问题?
最佳答案
您不能使用jvalue[]
。您需要使用jobobjectArray
。
jobjectArray values = env->NewObjectArray(2, clazz, env->NewStringUTF(""));
env->SetObjectArrayElement(values, 0, env->NewStringUTF("invoke by C++ 1"));
env->SetObjectArrayElement(values, 1, env->NewStringUTF("invoke by C++ 2"));
env->CallVoidMethod(instance, methodId, values);
请注意,我调用的是 CallVoidMethod
而不是 CallVoidMethodA
。
关于java - JNI 错误 : attempt to pass an instance of java. lang.String 作为参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41078946/