我试图通过使用 JNI 调用 API 调用 NewObjectA() 函数来在 C++ 中创建一个 jobobject。但是,我不确定应该如何将参数传递给构造函数。 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
的类型为 union。
声明如下:
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
。
关于java - 为 NewObjectA() 函数创建 jvalues args 数组时出错 - JNI 调用 API,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52853474/