为 NewObjectA() 函数创建 args jvalues 数组时出错 - JNI 调用 API

Error creating args array of jvalues for NewObjectA() function - JNI Invocation API

我正在尝试通过使用 JNI 调用 API 调用 NewObjectA() 函数来在 C++ 中创建一个 jobject。但是,我不确定应该如何将参数传递给构造函数。 JNI API 文档指出:

jobject NewObjectA(JNIEnv *env, jclass clazz,jmethodID methodID, const jvalue *args);

NewObjectA

Programmers place all arguments that are to be passed to the constructor in an args array of jvalues that immediately follows the methodID argument. NewObjectA() accepts the arguments in this array, and, in turn, passes them to the Java method that the programmer wishes to invoke.

在我的例子中,构造函数需要传递给它的两个 java 字符串。因此,我尝试了以下方法:

jclass jcls_File = env->FindClass("java/io/File");
jmethodID  File_constructor = env->GetMethodID(jcls_File, "<init>","(Ljava/lang/String;Ljava/lang/String;)V");
jstring home = ctojstring(env,"/home/workspace");
jstring filename = ctojstring(env,"mydatafile");
jvalue FileLocationParams[] = {home,filename};  // COMPILE ERROR HERE.
jobject MyDataFile = env->NewObjectA(jcls_File, File_constructor,FileLocationParams);

其中ctojstring就是下面的函数:

jstring ctojstring(JNIEnv *env,std::string mystring){
    return env->NewStringUTF(mystring.c_str());
}

但是当我尝试编译时,我在 Eclipse 中遇到以下错误:

错误:从‘jstring {aka _jstring*}’到‘jboolean {aka unsigned char}’的无效转换[-fpermissive]

有没有想过为什么会这样?

jvalue 是联合类型。

声明如下:

typedef union jvalue { 
    jboolean z; 
    jbyte    b; 
    jchar    c; 
    jshort   s; 
    jint     i; 
    jlong    j; 
    jfloat   f; 
    jdouble  d; 
    jobject  l; 
} jvalue;

如果您想将 jstring 分配给 jvalue,您可以按照以下步骤操作。

jvalue FileLocationParams[2];
FileLocationParams[0].l = home;
FileLocationParams[1].l = filename;

而不是

jvalue FileLocationParams[] = {home,filename};  // COMPILE ERROR HERE.

因为它将尝试将 homefilename 分配给 jvalue 的第一个成员,即 jboolean z