Передача строки из Java в JNI
Я хочу передать строку в JNI, который я пишу, который должен быть назначен const char *.
Ниже описано, как я это сделал:
JNI...(...,jstring jstr...){
const char* str = env->GetStringUTFChars(jstr,0);
env->ReleaseStringUTFChars(str,jstr,0);
}
Но если я printf const char * str после присвоения jstring, то, что я вижу, отличается от того, когда я назначил значение str непосредственно в JNI и printf оттуда.
Это правильный способ? Или есть ли другой способ назначить строку из java для const char * в JNI?
Ответы
Ответ 1
код Java
public static native double myMethod( String path);
Код C
JNIEXPORT jdouble JNICALL Java_your_package_structure_className_myMethod
(JNIEnv * env, jobject jobj, jstring pathObj) {
char * path;
path = (*env)->GetStringUTFChars( env, pathObj, NULL ) ;
Ответ 2
Все, что вы делаете, является правильным.
Есть и другой способ, но получить wchar_t вместо char:
const wchar_t * utf16 = (wchar_t *)env->GetStringChars(bytes, NULL);
size_t length = (size_t)env->GetStringLength(bytes);
...
env->ReleaseStringChars(bytes, (jchar *)utf16);
Ответ 3
На самом деле, решение прост: последний параметр "GetStringUTFChars" - это JNI_TRUE для отправки копии. Поскольку вы передаете JNI_FALSE (0) и вызываете "ReleaseStringUTFChars", вы уничтожаете ссылку. То, что вы видите после "освобождения", - это случайные байты из другого места в вашей памяти приложения.
Вызов "GetStringUTFChars" с JNI_TRUE или удаление вызова "ReleaseStringUTFChars" решает вашу проблему.
РЕДАКТИРОВАТЬ: Извините за копание кладбища.
Ответ 4
Как объяснил #Jigar:
JNIEXPORT jdouble JNICALL Java_your_package_structure_className_myMethod
(JNIEnv * env, jobject jobj, jstring jstr) {
const char *path = (*env)->GetStringUTFChars( env, jstr , NULL ) ;
чтобы получить jstring из java, нужно написать метод С++, как показано ниже
Код С++:
const char *path = env->GetStringUTFChars(jstr , NULL ) ;
UPDATE:
Как упоминалось в комментариях, в коде была ошибка. Теперь он исправлен.
Ответ 5
JNIEXPORT jstring JNICALL Java_Hello_sayHi(JNIEnv *env, jobject obj, jstring string) {
const char *str = env->GetStringUTFChars(string, 0);
printf("%s", str);
}