JNI. Как получить jstring из jobject и преобразовать его в char*

Это то, что у меня есть до сих пор: я передаю объект, который имеет 2 поля: String и Integer, в качестве параметра, и я хочу отправить информацию для его обработки в части C, что на данный момент не важно... Я получаю жалобы при объявлении jstring

JNIEXPORT jint JNICALL Java_Tier3_NativeMethods_totalPalletsIn(
            JNIEnv *env, jclass cls, jobject stat) {

jclass staticsitcs = (*env)->GetObjectClass(env, stat);

// Here I try to get it using the ID
jfieldID idDate = (*env)->GetFieldID(env, staticsitcs, "date", "S");

jstring dateString = (jstring)(*env)->GetStringRegion(env, stat, idDate);

// Here converting whatever I get in jstring to char*
char* date = (*env)->GetStringUTFChars(env,dateString,0);

// Getting the 2nd field from the object
jfieldID idNumber = (*env)->GetFieldID(env, staticsitcs, "amount", "I");

jint amount = (*env)->GetDoubleField(env, stat, idNumber);

// Calling C method
jint totalPallets = checkTotalPalletsIn(date, amount);

(*env)->ReleaseStringUTFChars(env, dateString, date);

return totalPallets;
}

Что мне не хватает?


person Aleksandr    schedule 10.12.2013    source источник


Ответы (1)


jstring dateString = (jstring)(*env)->GetObjectField(env, stat, idDate);

… и после этого все в порядке.

person Alex Cohn    schedule 10.12.2013
comment
Это помогло, но теперь я получаю, что инициализация отбрасывает квалификатор «const» из целевого типа указателя, когда я пытаюсь передать дату в метод C. Любые советы по этому поводу? - person Aleksandr; 10.12.2013
comment
Вы случайно не объявляли date как ‹b›const char *‹/b›? - person Alex Cohn; 10.12.2013
comment
Нет, это просто char*. Ну... Я понял, что это было просто предупреждение, так что ничего особенного, но теперь, когда я его компилирую, я вижу это: /cygdrive/c/Temp/ccLeMJG9.s: Сообщения ассемблера: /cygdrive/c/Temp/ccLeMJG9. s:15: Ошибка: недопустимый суффикс инструкции для push' /cygdrive/c/Temp/ccLeMJG9.s:25: Error: operand type mismatch for call' .... - person Aleksandr; 11.12.2013
comment
Хорошо, теперь это исправлено. Использован 64-битный компилятор вместо 32-х. - person Aleksandr; 11.12.2013
comment
@AlexCohn, не могли бы вы рассказать, как извлечь имя класса из объекта Jclass? - person kumarD; 13.02.2017
comment
@AlexCohn я делаю это, чтобы получить имя метода (*jvmti)->GetMethodName(jvmti,frames[i].method,&methodName,NULL,NULL); и получение ссылки jclass через: (*jvmti)->GetMethodDeclaringClass(jvmti,frames[i].method,&declaring_class_ptr); нужна помощь в получении имени класса из ссылки jclass - person kumarD; 13.02.2017