JNI chuyển đổi jstring thành char *


113

Tôi đã chuyển một chuỗi URL từ mã Java sang C làm jstringkiểu dữ liệu thông qua việc sử dụng JNI. Và phương thức thư viện của tôi cần một char *url dưới dạng.

Tôi có thể chuyển đổi jstringbằng cách char *nào?

PS: Có lợi thế nào khi sử dụng jcharArray trong C không? (tức là Truyền char []thay vì chuỗi trong phương thức gốc)


Bạn đã xem xét việc tham khảo các tài liệu?
Marquis of Lorne

Câu trả lời:


227

Đây là một vài liên kết hữu ích mà tôi đã tìm thấy khi bắt đầu với JNI

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

liên quan đến vấn đề của bạn, bạn có thể sử dụng cái này

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
là nó cần thiết để giữ nativeStringliên tục?
Prasham

5
nếu bạn kiểm tra liên kết thứ hai, nguyên mẫu của hàm GetStringUTFChars là: const jbyte * GetStringUTFChars (JNIEnv * env, jstring string, jboolean * isCopy); vì vậy bạn không thực sự có một sự lựa chọn
Jason Rogers

1
Tôi nghĩ điều đáng chú ý là kỹ thuật được nêu ở đây (và trên trang Wikipedia) sử dụng mã hóa UTF-8 đã được sửa đổi, có thể không hoạt động trong mọi tình huống. Xem developer.android.com/guide/practices/…
cqcallaw

1
Cảm ơn, công việc đó nhưng thú vị là const char * không thể chuyển đổi thành char * :).
CoDe

1
@CoDe Về mặt kỹ thuật, nó có thể với một số phép thuật, nhưng điều đó tốt nhất là tránh; nó có lẽ được tuyên bố constvì một lý do. Câu trả lời chính xác cho vấn đề của bạn là strcpytừ const char*thành a char*. Điều đó sẽ cung cấp cho bạn biến thể char*mà bạn muốn.
Loduwijk

51

Cảm ơn câu trả lời của Jason Rogers trước.

Trong Android && cpp nên là:

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

// use your string

env->ReleaseStringUTFChars(javaString, nativeString);

Có thể sửa lỗi này:

1.error: toán hạng cơ sở của '->' có kiểu không phải là con trỏ 'JNIEnv {aka _JNIEnv}'

2. lỗi: không có hàm phù hợp cho lệnh gọi đến '_JNIEnv :: GetStringUTFChars (JNIEnv * &, _jstring * &, bool)'

3. lỗi: không có hàm phù hợp cho lệnh gọi tới '_JNIEnv :: ReleaseStringUTFChars (JNIEnv * &, _jstring * &, char const * &)'

4.add "env-> DeleteLocalRef (nativeString);" cuối cùng.


Bạn cần phải có (* env) -> thay vì env->
AlexanderNajafi

2
Bạn chỉ cần (*env)->nếu bạn đang sử dụng C, không phải C ++.
sixones
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.