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

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

我试图通过使用 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.

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

关于java - 为 NewObjectA() 函数创建 jvalues args 数组时出错 - JNI 调用 API,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52853474/

相关文章:

Java @Inject 模块和ServiceLoader之间的空指针

java - Sonarqube 评估 - Ant Build 失败

c - 错误 : expected ')' before ';' token

c# - 为什么在构建期间出现此错误?提到一些有关无法调试的信息

java - Android:在回收 View 中获取用户在屏幕上的确切位置

java - 需要知道用户加入 Liferay 组的日期

c++ - 使用 boost::spirit 解析类似 c-struct 的声明

c++ - 在 UNICODE_STRING 中搜索字符

c++ - 使用迭代器插入字符串的特定部分? (C++)

android - 在Android版Eclipse中使用新版本的开发工具等时出错