JNI แปลง jstring เป็น char *


113

ฉันส่งสตริง URL จากโค้ด Java เป็น C เป็นjstringประเภทข้อมูลผ่านการใช้ JNI และวิธีการไลบรารีของฉันต้องการchar *as url

ฉันจะแปลงjstringในchar *?

PS: มีข้อดีของการใช้ jcharArray ใน C หรือไม่? (เช่นการส่งผ่านchar []แทนสตริงในวิธีดั้งเดิม)


คุณได้พิจารณาให้คำปรึกษาเอกสารหรือไม่?
Marquis of Lorne

คำตอบ:


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คงที่หรือไม่?
Prasham

5
หากคุณตรวจสอบลิงก์ที่สองต้นแบบของฟังก์ชัน GetStringUTFChars คือ: const jbyte * GetStringUTFChars (JNIEnv * env, สตริง jstring, jboolean * isCopy); ดังนั้นคุณจึงไม่มีทางเลือกจริงๆ
Jason Rogers

1
ฉันคิดว่าเป็นที่น่าสังเกตว่าเทคนิคที่อธิบายไว้ที่นี่ (และในหน้า Wikipedia) ใช้การเข้ารหัส UTF-8 ที่แก้ไขแล้วซึ่งอาจใช้ไม่ได้ในทุกสถานการณ์ ดูdeveloper.android.com/guide/practices/…
cqcallaw

1
ขอบคุณที่ใช้งานได้ แต่ const char * ไม่สามารถแปลงเป็น char * :)
CoDe

1
@CoDe ในทางเทคนิคมันสามารถทำได้ด้วยเวทมนตร์บางอย่าง แต่ควรหลีกเลี่ยงที่ดีที่สุด อาจมีการประกาศconstด้วยเหตุผล การตอบสนองที่ถูกต้องสำหรับปัญหาของคุณคือstrcpyจากconst char*เป็นไฟล์char*. นั่นควรให้สิ่งที่เปลี่ยนแปลงได้ตามchar*ที่คุณต้องการ
Loduwijk

51

ขอบคุณคำตอบของ Jason Rogers ก่อน

ใน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
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.