JNI mengonversi jstring ke char *


113

Saya telah melewati string URL dari kode Java ke C sebagai jstringtipe data melalui penggunaan JNI. Dan metode perpustakaan saya membutuhkan char *sebagai url.

Bagaimana saya bisa mengkonversi jstringdi char *?

PS: Apakah ada keuntungan menggunakan jcharArray di C? (yaitu Meneruskan char []alih-alih string dalam metode asli)


Sudahkah Anda mempertimbangkan untuk membaca dokumentasi?
Marquis dari Lorne

Jawaban:


227

Berikut adalah beberapa tautan berguna yang saya temukan ketika saya mulai menggunakan JNI

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

mengenai masalah Anda, Anda dapat menggunakan ini

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
apakah perlu untuk tetap nativeStringkonstan?
Prasham

5
jika Anda memeriksa tautan kedua, prototipe dari fungsi GetStringUTFChars adalah: const jbyte * GetStringUTFChars (JNIEnv * env, jstring string, jboolean * isCopy); jadi Anda tidak benar-benar memiliki pilihan
Jason Rogers

1
Saya pikir perlu dicatat bahwa teknik yang diuraikan di sini (dan di halaman Wikipedia) menggunakan pengkodean UTF-8 yang dimodifikasi, yang mungkin tidak berfungsi di semua situasi. Lihat developer.android.com/guide/practices/…
cqcallaw

1
Terima kasih, itu berhasil tetapi yang menarik, const char * tidak dapat diubah menjadi char * :).
CoDe

1
@CoDe Secara teknis, itu bisa dengan sihir, tapi sebaiknya dihindari; itu mungkin diumumkan constkarena suatu alasan. Tanggapan yang benar untuk masalah Anda adalah strcpymulai dari const char*ke a char*. Itu akan memberi Anda perubahan char*yang Anda inginkan.
Loduwijk

51

Terima kasih jawaban Jason Rogers pertama.

Di Android && cpp harus seperti ini:

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

// use your string

env->ReleaseStringUTFChars(javaString, nativeString);

Dapat memperbaiki kesalahan ini:

1. error: operan dasar '->' memiliki jenis non-pointer 'JNIEnv {aka _JNIEnv}'

2. kesalahan: tidak ada fungsi yang cocok untuk panggilan ke '_JNIEnv :: GetStringUTFChars (JNIEnv * &, _jstring * &, bool)'

3. kesalahan: tidak ada fungsi yang cocok untuk panggilan ke '_JNIEnv :: ReleaseStringUTFChars (JNIEnv * &, _jstring * &, char const * &)'

4. tambahkan "env-> DeleteLocalRef (nativeString);" di akhir.


Anda harus memiliki (* env) -> bukannya env->
AlexanderNajafi

2
Anda hanya perlu (*env)->jika Anda menggunakan C, bukan C ++.
Sixones
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.