为 NewObjectA() 函数创建 jvalues 的参数数组时出错 - JNI Invocation API

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

本文关键字:出错 数组 JNI API Invocation 参数 NewObjectA 函数 jvalues 创建      更新时间:2023-10-16

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

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

新对象A

程序员将所有要传递给 紧跟在 方法标识参数。NewObjectA(( 接受此数组中的参数, 反过来,将它们传递给程序员的 Java 方法 希望调用。

在我的例子中,构造函数需要传递给它两个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}"的转换无效 [-permissive]

关于为什么会发生这种情况的任何想法?

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.