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

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

將 Java ArryList<String> 傳遞給 JNI C 函數并在 C 中打印列表

將 Java ArryList<String> 傳遞給 JNI C 函數并在 C 中打印列表

Qyouu 2021-11-24 14:47:19
我在 Java 中有以下本機方法:public class ConsoleIO{    public native static void printList(List<String> list);   ......}與 JNI 對應的 C 實現如下:JNIEXPORT void JNICALL Java_ConsoleIO_printList(JNIEnv *env, jclass cls, jobject obj){}現在我需要將一個字符串列表從 java 傳遞到 printList(List list) 方法,并從上面的 C 實現循環遍歷它,并從 C 函數在控制臺中打印它們。我知道這個 List 類型沒有 C 表示,但是我需要知道如何在 C 中訪問這個字符串列表并在 C 本身中打印出來?
查看完整描述

2 回答

?
UYOU

TA貢獻1878條經驗 獲得超4個贊

我找到了解決方案:


JNIEXPORT void JNICALL Java_ConsoleIO_printList(JNIEnv *env, jclass cls, jobject obj)

{


    jclass listClass = (*env)->GetObjectClass(env,obj);


    jmethodID sizeMethod = (*env)->(env,listClass,"size","()I");

    jmethodID getMethod = (*env)->GetMethodID(env,listClass,"get","(I)Ljava/lang/Object");


    jint size =  (*env)->CallIntMethod(env,sizeMethod);



}


查看完整回答
反對 回復 2021-11-24
?
胡說叔叔

TA貢獻1804條經驗 獲得超8個贊

Java 有類型擦除。所以在編譯后的代碼中List<String>就變成List了。


因此,您真正要尋找的是使用 JNI 實現以下 Java 調用:


jint size = list.size();

for (jint i = 0; i < size; i++) {

    jobject elem = list.get(i);

    jstring str = (jstring)elem;

    ... print str ...

}

在上面的 C 代碼中,list.size()andlist.get()必須替換為對GetMethodID,CallIntMethod和 的調用CallObjectMethod??梢詓tr使用GetStringChars或檢索字符串GetStringUTFLength。并且需要一些內存管理:ReleaseXXX.


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

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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