Передача строки из Java в JNI - PullRequest
20 голосов
/ 22 ноября 2010

Я хочу передать в JNI, который я пишу, строку, которая должна быть присвоена const char *. Ниже указано, как я это сделал:

JNI...(...,jstring jstr...){

const char* str = env->GetStringUTFChars(jstr,0);
env->ReleaseStringUTFChars(str,jstr,0);

}

Но если я печатаю const char * str после присвоения jstring, то я вижу то, что я вижу иначе, чем когда я назначил значение str непосредственно в JNI и printf оттуда.

Это правильный способ сделать? Или есть какой-либо другой способ назначить строку из Java для const char * в JNI?

Ответы [ 5 ]

29 голосов
/ 22 ноября 2010

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 голосов
/ 22 ноября 2010

Все, что вы делаете, правильно.Есть другой способ, кроме получения 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);
0 голосов
/ 23 мая 2018
JNIEXPORT jstring JNICALL Java_Hello_sayHi(JNIEnv *env, jobject obj, jstring string) {
     const char *str = env->GetStringUTFChars(string, 0);
     printf("%s", str);
}
0 голосов
/ 26 декабря 2015

Как объяснил #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, нужно написать метод c ++, как показано ниже

C ++ code:

const char *path = env->GetStringUTFChars(jstr , NULL ) ;

ОБНОВЛЕНИЕ: Как уже упоминалось в комментариях, в коде произошла ошибка.Теперь это исправлено.

0 голосов
/ 12 января 2015

На самом деле решение простое: последний параметр «GetStringUTFChars» - это JNI_TRUE для отправки копии. Поскольку вы передаете JNI_FALSE (0) и вызываете «ReleaseStringUTFChars», вы уничтожаете ссылку. После «освобождения» вы видите случайные байты из других частей памяти вашего приложения.

Вызов «GetStringUTFChars» с JNI_TRUE или удаление вызова «ReleaseStringUTFChars» решит вашу проблему.

РЕДАКТИРОВАТЬ: Извините за рытье кладбища.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...