// Java 代码
import java.util.ArrayList;
public class JNIExample {
static {
System.loadLibrary("native-lib");
}
public native ArrayList<byte[]> getArrayListFromJNI();
public static void main(String[] args) {
JNIExample example = new JNIExample();
ArrayList<byte[]> list = example.getArrayListFromJNI();
for (byte[] array : list) {
for (byte b : array) {
System.out.print(b + " ");
}
System.out.println();
}
}
}
// C++ 代码 (JNI)
#include <jni.h>
#include <vector>
#include <string>
extern "C" JNIEXPORT jobject JNICALL
Java_JNIExample_getArrayListFromJNI(JNIEnv* env, jobject /* this */) {
// 创建一个 ArrayList 对象
jclass arrayListClass = env->FindClass("java/util/ArrayList");
jmethodID arrayListInit = env->GetMethodID(arrayListClass, "<init>", "()V");
jobject arrayListObj = env->NewObject(arrayListClass, arrayListInit);
// 获取 add 方法的 ID
jmethodID addMethod = env->GetMethodID(arrayListClass, "add", "(Ljava/lang/Object;)Z");
// 创建一些 byte 数组并添加到 ArrayList 中
std::vector<std::vector<jbyte>> byteVectors = {
{1, 2, 3},
{4, 5, 6},
{7, 8, 9}
};
for (const auto& vec : byteVectors) {
jbyteArray byteArray = env->NewByteArray(vec.size());
env->SetByteArrayRegion(byteArray, 0, vec.size(), vec.data());
env->CallBooleanMethod(arrayListObj, addMethod, byteArray);
}
return arrayListObj;
}
Java 代码:
JNIExample
类中定义了一个本地方法 getArrayListFromJNI()
,该方法返回一个 ArrayList<byte[]>
。main
方法中,调用 getArrayListFromJNI()
并打印出每个 byte[]
的内容。C++ 代码 (JNI):
ArrayList
对象,并获取其构造函数和 add
方法的 ID。byte[]
数组并通过 add
方法将它们添加到 ArrayList
中。byte[]
数组的 ArrayList
对象给 Java 层。这样就实现了从 JNI 层返回一个包含 byte[]
数组的 ArrayList
给 Java 层。
下一篇:java 保留2位小数
Laravel PHP 深圳智简公司。版权所有©2023-2043 LaravelPHP 粤ICP备2021048745号-3
Laravel 中文站