JNI перетворює jstring в char *


113

Я передав рядок URL від Java до коду С як jstringтип даних за допомогою JNI. І мій метод бібліотеки потребує char *URL-адреси.

Як я можу перетворити jstringв char *?

PS: Чи є якась перевага використання jcharArray в C? (тобто передача char []замість рядка в нативному методі)


Чи розглядали Ви, як проконсультувати документацію?
Маркіз Лорн

Відповіді:


227

Ось кілька корисних посилань, які я знайшов, коли почав з 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постійно тримати ?
Прашам

5
якщо ви перевіряєте друге посилання, прототипом функції GetStringUTFChars є: const jbyte * GetStringUTFChars (JNIEnv * env, jstring string, jboolean * isCopy); тож у вас насправді немає вибору
Джейсон Роджерс

1
Я думаю, що варто відзначити, що в описаній тут техніці (та на сторінці Вікіпедії) використовується модифіковане кодування UTF-8, яке може працювати не у всіх ситуаціях. Дивіться developer.android.com/guide/practices/…
cqcallaw

1
Дякую, що робота, але що цікаво con 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.error: базовий операнд '->' має непоказний тип 'JNIEnv {aka _JNIEnv}'

2.error: немає функції узгодження для виклику до '_JNIEnv :: GetStringUTFChars (JNIEnv * &, _jstring * &, bool)'

3.error: немає функції узгодження для виклику до '_JNIEnv :: ReleaseStringUTFChars (JNIEnv * &, _jstring * &, char const * &)'

4.add "env-> DeleteLocalRef (nativeString);" в кінці.


Вам потрібно мати (* env) -> замість env->
AlexanderNajafi

2
Вам потрібно лише (*env)->якщо ви використовуєте C, а не C ++.
шестиколій
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.