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

时间:2018-10-17 11:10:35

标签: java c++ compiler-errors java-native-interface invocation

我正在尝试通过使用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]

对为什么会发生这种情况有任何想法吗?

1 个答案:

答案 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.

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