不過還好 , 總算把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
要特別注意了.....這個差點搞死我了= =
No comments:
Post a Comment