Re: [問題] 請教會C語言或JNI的版友
: 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
討論串 (同標題文章)
AndroidDev 近期熱門文章
PTT數位生活區 即時熱門文章