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)

Prasham
sumber
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);
}
Jason Rogers
sumber
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.

Kangear
sumber
Anda harus memiliki (* env) -> bukannya env->
AlexanderNajafi
2
Anda hanya perlu (*env)->jika Anda menggunakan C, bukan C ++.
Sixones