Передача строки из 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);
}