gpt4 book ai didi

java - 如何通过引用将 List 从 Java 作为 vector 传递给 JNI C++?

转载 作者:行者123 更新时间:2023-11-30 04:47:11 25 4
gpt4 key购买 nike

我刚接触 C++ 和 JNI

流程应该是这样的

我从 Java 传递一个空的 List到 JNI,JNI 调用方法 loadData(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 JNICALL
Java_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++...

任何想法表示赞赏

最佳答案

在这种情况下,它非常简单。您所要做的就是将 List 传递给您的 native 代码,并使用基于 JNI 的访问方法将其填充到 JNI 部分

#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);

}

请注意,您不必在 JNI 中创建 List 对象,因为您已经在 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

关于java - 如何通过引用将 List 从 Java 作为 vector 传递给 JNI C++?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56364635/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com