我正在尝试通过使用JNI调用API调用NewObjectA()函数在C ++中创建一个jobject。但是,我不确定如何将参数传递给构造函数。 JNI API文档指出:
jobject NewObjectA(JNIEnv * env,jclass clazz,jmethodID methodID,const jvalue * args);
NewObjectA
程序员放置所有要传递给 jvalue的args数组中的构造函数,紧跟在 methodID参数。 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}”的无效转换[-fpermissive]
对为什么会发生这种情况有任何想法吗?
答案 0 :(得分:1)
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.
因为它将尝试将home
和filename
分配给jvalue
的第一个成员jboolean z
。