亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

Android:從 C++ 調用帶有 byte[] 參數的 java 方法

Android:從 C++ 調用帶有 byte[] 參數的 java 方法

江戶川亂折騰 2021-08-04 17:06:56
我是一名 Android 開發人員,并且是 JNI 的新手 - 我想要做的是將字節數組從 c++ 方法傳遞到 java 方法。這是我的 C++ 方法的樣子:void func(char* bytes) {    jclass callbackClass = fJNIEnv->GetObjectClass(fJObject);    jmethodID javaFunc = fJNIEnv->GetMethodID(callbackClass, "javaFunc", "([B)V");    jbyteArray array = fJNIEnv->NewByteArray(sizeof(bytes));    fJNIEnv->SetByteArrayRegion(array, 0, sizeof(bytes), (jbyte *) bytes);    fJNIEnv->CallNonvirtualVoidMethod(fJObject, callbackClass, javaFunc, array);}這是 javaFunc 方法:public void javaFunc(byte[] bytes) {    ...}當我調試 func 方法時,bytes指向一個字符數組,但是當我使用該javaFunc方法時,bytes它是類似 {16, 0, 0, 0} 的東西 - 它與它必須的完全不同。任何幫助,將不勝感激。
查看完整描述

2 回答

?
jeck貓

TA貢獻1909條經驗 獲得超7個贊

使用sizeof(bytes)是錯誤的。這為您提供了char*指針本身的字節大?。?2 位中 4 個,64 位中 8 個),而不是所指向數據的字節大小。


您需要更改func()以傳入char數組中s的數量。然后,您可以在分配和填充 JNI 數組時使用該數字。


此外,您需要在CallNonvirtualVoidMethod()退出后釋放 JNI 數組。


試試這個:


void func(char* bytes, int numBytes)

{

    jclass callbackClass = fJNIEnv->GetObjectClass(fJObject);

    jmethodID javaFunc = fJNIEnv->GetMethodID(callbackClass, "javaFunc", "([B)V");


    jbyteArray array = fJNIEnv->NewByteArray(numBytes);

    fJNIEnv->SetByteArrayRegion(array, 0, numBytes, (jbyte *) bytes);


    fJNIEnv->CallNonvirtualVoidMethod(fJObject, callbackClass, javaFunc, array);

    fJNIEnv->DeleteLocalRef(array);

}

或者,傳入一個更合適的 C++ 容器,例如std::vector<char>:


void func(const std::vector<char> &bytes)

{

    jclass callbackClass = fJNIEnv->GetObjectClass(fJObject);

    jmethodID javaFunc = fJNIEnv->GetMethodID(callbackClass, "javaFunc", "([B)V");


    jbyteArray array = fJNIEnv->NewByteArray(bytes.size());

    fJNIEnv->SetByteArrayRegion(array, 0, bytes.size(), (jbyte *) bytes.data());


    fJNIEnv->CallNonvirtualVoidMethod(fJObject, callbackClass, javaFunc, array);

    fJNIEnv->DeleteLocalRef(array);

}


查看完整回答
反對 回復 2021-08-04
  • 2 回答
  • 0 關注
  • 415 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號