有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

JNI错误:尝试传递java实例。字符串作为参数

这是我的一些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以使com无效。恒业。ndktest。主测试。appendLine(java.lang.String[])

只有我这样声明appendLine方法,代码才能正常运行:

private void appendLine(String str1, String str2){

   System.out.print(str1 + str2);

}

我怎样才能解决这个问题


共 (1) 个答案

  1. # 1 楼答案

    您不能使用jvalue[]。您需要使用jobjectArray

    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