2 回答

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

TA贡献2012条经验 获得超12个赞
提到的答案似乎适用于 Windows 10,但不适用于 Windows 8。Windows
8 不支持 Cpp 库中的任何容器。
报告的错误将是 - “%1 不是有效的 Win32 应用程序”
,这在运行 Java 程序时发生。
此处生成的 dll 文件似乎是问题所在。
添加回答
举报