Re: [問題] 請教會C語言或JNI的版友

看板AndroidDev作者 (null)時間13年前 (2011/07/25 20:57), 編輯推噓1(102)
留言3則, 3人參與, 最新討論串2/3 (看更多)
: JNIEXPORT jstring JNICALL : Java_com_android_testuart_Uart2C_receiveMsgUart(JNIEnv *env, jobject mc) { : char buffer[1024]; : char buf[1024]; : int len, i = 0, k = 0; : memset(buffer, 0, sizeof(buffer)); : len = read(fd, buffer, sizeof(buffer)); : if (len >0) { : buffer[len]='\0'; : return ((*env)->NewStringUTF(env, buffer)); : } else : return NULL; : } 看起來沒有必要傳 jstring 你 sensor 傳來的也不是真的能顯示的字串啊 不如把參數改成 byte[] 直接把 sensor 給 memcpy 進去,java 端就會拿到了。 http://www.javaworld.com.tw/jute/post/view?bid=11&id=291118&sty=3 像例子內的 Mp3 Decoder 的 decode 函式: public native int decode(byte[] buffer); 把 byte[] 傳給底層,而寫了多少利用 return value 傳回 /* * Class: qty_player_Mp3Decoder * Method: decode * Signature: ([B)I */ JNIEXPORT jint JNICALL Java_qty_player_Mp3Decoder_decode (JNIEnv *env, jobject self, jbyteArray buf) { // 讀得 buf 的大小,供 mpg123_read 使用 jint len = (*env)->GetArrayLength(env, buf); jbyte* cbuf = (*env)->GetByteArrayElements(env, buf, NULL); // 取回 mpg123_handle* 指標位址 jclass cls = (*env)->GetObjectClass(env, self); jfieldID fid = (*env)->GetFieldID(env, cls, "handle", "I"); jint handleId =(*env)->GetIntField(env, self, fid); (*env)->DeleteLocalRef(env, cls); // 呼叫 decode 函式,並寫入 buf 內。 int decodedBytes = 0; /* 改用你的 mempcy,注意參考 len 不要超出邊界 */ int err = mpg123_read((mpg123_handle*) handleId, cbuf, len, &decodedBytes); (*env)->ReleaseByteArrayElements(env, buf, cbuf, 0); // 回傳本次 decode 資料的長度 if(err == MPG123_OK) return decodedBytes; return -1; // 仿一邊的檔案讀寫,-1 代表結束 。 } -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 61.231.49.83 ※ 編輯: qrtt1 來自: 61.231.49.83 (07/25 21:06)

07/25 21:48, , 1F
07/25 21:48, 1F

07/27 22:27, , 2F
ㄜ...我看不太懂@@ 還有很多地方要學
07/27 22:27, 2F

07/27 23:00, , 3F
看不懂就是該做功課的時候啦
07/27 23:00, 3F
文章代碼(AID): #1EBMWkhR (AndroidDev)
文章代碼(AID): #1EBMWkhR (AndroidDev)