1

This is my some Java Code:

public class MainTest{

/*
...
*/

    public native void invokeByCPlusPlus();

    private void appendLine(String... strs){
        for(String str : strs) {
            System.out.println("get s : " + str);
        }
    }
}

and I want to use jni call my Java method "appendLine(String... strs)" when I call invokeByCPlusPlus() method in Java:

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;
}

then I get an error : JNI ERROR : attempt to pass an instance of java.lang.String as argument 1 to void com.hengye.ndktest.MainTest.appendLine(java.lang.String[])

only I declare appendLine method like this the code run normally:

private void appendLine(String str1, String str2){

   System.out.print(str1 + str2);

}

How can I solve this problem?

1 Answer 1

1

You cannot use jvalue[]. You need to use 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);

Note that I call CallVoidMethod instead of CallVoidMethodA.

Sign up to request clarification or add additional context in comments.

1 Comment

Thank you very much, but it works after change some code: jclass stringClass = env->FindClass("java/lang/String"); jobjectArray values = env->NewObjectArray(3, stringClass, env->NewStringUTF(""));

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.