7/12/2011

Covert string to char

這幾個禮拜 , 為了要在Android 2.3上implement HID profile 真的快把我給搞死...

不過還好 , 總算把bluetooth keyboard & mouse給弄出來了 !

過幾天再把一些心得和方法分享給在上面.

因為要自己寫JNI , 遇到上層的JAVA要傳一個字串下來 , 想當然爾JNI一定會宣告Jstring來接JAVA的字串.

但可不能直接把這個字串丟到C/C++的function , 一丟Android就直接process died....

這需要做一些轉換.

但說實在的 , JAVA 非常的不熟...所以直接從bluetooth的JNI抓出來看再改一改放到我的code裡面...

還滿簡單的.


/* Transfer jstring to C for */
const char *c_mac = env->GetStringUTFChars(address, 0);

size_t mac_sz = env->GetStringUTFLength(address) + 1;

char *c_mac_copy = (char *)malloc(mac_sz);

strncpy(c_mac_copy, c_mac, mac_sz);

hidd_command(c_mac_copy,mode);

env->ReleaseStringUTFChars(address, c_mac);



說穿了就是用GetSrtingUTFChars來轉 , 再用GetStringUTFLength來算長度 , 最後再用strncpy來把字串copy過去而己



但要注意的是,上面相對來說是指C++的JNI,如果是C的JNI,就要改成這樣了 :

const char *c_mac = (*env)->GetStringUTFChars(env,address, 0);

size_t mac_sz = (*env)->GetStringUTFLength(env,address) + 1;

char *c_mac_copy = (char *)malloc(mac_sz); // callback data

strncpy(c_mac_copy, c_mac, mac_sz);

hidd_command(c_mac_copy,mode);

(*env)->ReleaseStringUTFChars(env,address, c_mac);



原因在於jni.h的定義,路徑在 dalvik/libnativehelper/include/nativehelper/jni.h :

struct _JNIEnv;
struct _JavaVM;
typedef const struct JNINativeInterface* C_JNIEnv;

#if defined(__cplusplus)
typedef _JNIEnv JNIEnv;
typedef _JavaVM JavaVM;
#else
typedef const struct JNINativeInterface* JNIEnv;
typedef const struct JNIInvokeInterface* JavaVM;
#endif


要特別注意了.....這個差點搞死我了= =