java - JNI 错误 : attempt to pass an instance of java. lang.String 作为参数

标签 java java-native-interface

这是我的一些 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/

相关文章:

java-native-interface - JNI_CreateJavaVM 使我的程序崩溃,没有任何消息或异常

java - 如何使用 JNI 将终端输出从 C 程序重定向到 System.out?

java - 尝试将 TCHAR 类型发送到接受字符串作为参数的 java 函数时,jvm 崩溃

java - Camel从http获取数据

java - jni 在内部类中找不到方法,java.lang.NoSuchMethodError

android - 如何在 ANDROID 应用程序中使用 openSSL 库

java - 正则表达式 : Parsing a Large string

Java Web 框架,用于新项目

java - 在 Spring boot 中将 AWS S3 文件下载为流

java - Spring 数据 Redis : Redis Pipeline returning always null