JNI преобразовывает jstring в char *

113

Я передал строку URL-адреса из кода Java в код C в качестве jstringтипа данных с помощью JNI. И моему библиотечному методу нужен char *URL-адрес as.

Как я могу конвертировать jstringв char *?

PS: Есть ли преимущества использования jcharArray в C? (т.е. передача char []вместо строки в собственном методе)

Прашам
источник
Вы думали о просмотре документации?
Marquis of Lorne

Ответы:

228

Вот пара полезных ссылок, которые я нашел, когда начал работать с JNI.

http://en.wikipedia.org/wiki/Java_Native_Interface
http://download.oracle.com/javase/1.5.0/docs/guide/jni/spec/functions.html

относительно вашей проблемы вы можете использовать это

JNIEXPORT void JNICALL Java_ClassName_MethodName(JNIEnv *env, jobject obj, jstring javaString)   
{
   const char *nativeString = env->GetStringUTFChars(javaString, 0);

   // use your string

   env->ReleaseStringUTFChars(javaString, nativeString);
}
Джейсон Роджерс
источник
1
нужно ли сохранять nativeStringпостоянство?
Prasham
5
если вы проверите вторую ссылку, прототип функции GetStringUTFChars будет: const jbyte * GetStringUTFChars (JNIEnv * env, jstring string, jboolean * isCopy); так что у вас действительно нет выбора
Джейсон Роджерс
1
Я думаю, стоит отметить, что описанный здесь метод (и на странице Википедии) использует модифицированную кодировку UTF-8, которая может работать не во всех ситуациях. См developer.android.com/guide/practices/...
cqcallaw
1
Спасибо, что работает, но что интересно, const char * не может преобразовать в char * :).
CoDe
1
@CoDe Технически, это можно сделать с помощью магии, но этого лучше избегать; это, наверное const, не зря заявлено . Правильный ответ на вашу проблему - перейти strcpyот const char*файла к файлу char*. Это должно предоставить вам желаемый изменяемый объект char*.
Loduwijk
51

Сначала спасибо за ответ Джейсона Роджерса.

В Android && cpp должно быть так:

const char *nativeString = env->GetStringUTFChars(javaString, nullptr);

// use your string

env->ReleaseStringUTFChars(javaString, nativeString);

Можно исправить эту ошибку:

1. ошибка: базовый операнд '->' не имеет типа указателя 'JNIEnv {aka _JNIEnv}'

2. ошибка: нет соответствующей функции для вызова '_JNIEnv :: GetStringUTFChars (JNIEnv * &, _jstring * &, bool)'

3. ошибка: нет соответствующей функции для вызова '_JNIEnv :: ReleaseStringUTFChars (JNIEnv * &, _jstring * &, char const * &)'

4. добавить "env-> DeleteLocalRef (nativeString);" в конце.

Кангер
источник
Вам нужно иметь (* env) -> вместо env->
AlexanderNajafi
2
Вам нужно только, (*env)->если вы используете C, а не C ++.
sixones