Я пытаюсь создать объект задания в C ++, вызывая функцию NewObjectA () с использованием API вызова JNI. Тем не менее, я не уверен, как я должен передавать аргументы в конструктор. Документация JNI API гласит:
jobject NewObjectA (JNIEnv * env, jclass clazz, jmethodID methodID, const
jvalue * args);NewObjectA
Программисты помещают все аргументы, которые должны быть переданы
конструктор в массиве аргументов jvalues, который следует сразу за
Аргумент 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]
Есть мысли о том, почему это происходит?
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
,
Других решений пока нет …