Ошибка при создании массива аргументов jvalues ​​для функции NewObjectA () - API вызова JNI - PullRequest
0 голосов
/ 17 октября 2018

Я пытаюсь создать объект задания в C ++, вызывая функцию NewObjectA () с использованием API вызова JNI.Тем не менее, я не уверен, как я должен передавать аргументы в конструктор.Документация JNI API гласит:

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

NewObjectA

Программисты размещают всеаргументы, которые должны быть переданы конструктору в массиве аргументов jvalue, который следует сразу за аргументом 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 голосов
/ 17 октября 2018

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.

...