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

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

如何通過引用將 List 從 Java 作為向量傳遞給 JNI C++?

如何通過引用將 List 從 Java 作為向量傳遞給 JNI C++?

皈依舞 2022-12-21 10:58:55
我剛接觸 C++ 和 JNI流程應該是這樣的我從 Java 向 JNI 傳遞一個空List值,JNIloadData(std::vector<int>)從中調用方法MyClass,此方法用數據填充我的列表。所以,問題是我有class MyClass {public:MyClass();~MyClass();void loadData(std::vector<int> & vector);};void MyClass::loadData(std::vector<int> & vector){const int size = 10;vector.resize(size);for (int i = 0; i < size; ++i) {    vector.push_back(4);}}這是我用純 C++ 編寫的方法,現在我需要像這樣從 Java 使用它public native void fillListWithData(List<Integer> list);所以,我在 JNI 中寫了這樣的方法來關聯它們extern "C" JNIEXPORT void JNICALLJava_com_google_ar_core_examples_java_helloar_HelloArActivity_fillListWithData(    JNIEnv *env,    jobject /* this */,    jobject input) {myClass->loadData("HERE I NEED TO PASS MY " input);}在這里我應該如何調用這個方法public void TEST(){    List<Integer> list = new ArrayList<>();    fillListWithData(list);    Log.e("TAG", "HERE I NEED TO HAVE A LIST WITH FILLED DATA");}我不明白如何通過 JNI 將此列表通過引用傳遞給 C++...任何想法贊賞
查看完整描述

2 回答

?
幕布斯6054654

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

在這種情況下,它非常簡單。您所要做的就是傳遞給您的本機代碼并使用基于訪問的方法List將其填充到內部JNIJNI


#include <vector>

#include "jni.h"

#include "recipeNo046_FillTheList.h"

using namespace std;


JNIEXPORT void JNICALL Java_recipeNo046_FillTheList_fillTheList

  (JNIEnv *env, jclass cls, jobject obj) {


  vector<int> vect { 1, 2, 3 };


  jclass listClass = env->FindClass("java/util/List");

  if(listClass == NULL) {

    return;                  // alternatively, throw exception (recipeNo019)

  }


  jclass integerClass = env->FindClass("java/lang/Integer");

  if(integerClass == NULL) {

    return;                  // alternatively, throw exception (recipeNo019)

  }


  jmethodID addMethodID = env->GetMethodID(listClass, "add", "(Ljava/lang/Object;)Z");

  if(addMethodID == NULL) {

    return;                  //                 - || -

  }


  jmethodID integerConstructorID = env->GetMethodID(integerClass, "<init>", "(I)V");

  if(integerConstructorID == NULL) {

    return;                  //                 - || -

  }


  for(int i : vect) {

    // Now, we have object created by Integer(i)

    jobject integerValue = env->NewObject(integerClass, integerConstructorID, i);

    if(integerValue == NULL) {

      return;

    }

    env->CallBooleanMethod(obj, addMethodID, integerValue);

  }


  env->DeleteLocalRef(listClass);

  env->DeleteLocalRef(integerClass);


}

請注意,您不必List在內部創建對象,JNI因為您已經在內部C++代碼中創建了它。它作為native方法的參數傳遞。


您可以在此處找到完整的示例代碼:


https://github.com/mkowsiak/jnicookbook/tree/master/recipes/recipeNo046


運行代碼后,您可以看到C++通過List對象傳遞的數據。


> make test

/Library/Java/JavaVirtualMachines/jdk-12.0.1.jdk/Contents/Home/bin/java -Djava.library.path=:./lib -cp target recipeNo046.FillTheList

library: :./lib

1

2

3


查看完整回答
反對 回復 2022-12-21
?
繁花如伊

TA貢獻2012條經驗 獲得超12個贊

提到的答案似乎適用于 Windows 10,但不適用于 Windows 8。Windows
8 不支持 Cpp 庫中的任何容器。
報告的錯誤將是 - “%1 不是有效的 Win32 應用程序”
,這在運行 Java 程序時發生。
此處生成的 dll 文件似乎是問題所在。

查看完整回答
反對 回復 2022-12-21
  • 2 回答
  • 0 關注
  • 257 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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