Return 使用 JNI 从 C++ 到 Java 列表<unsigned char*>
Return list<unsigned char*> from C++ to Java using JNI
我有以下 JNI 方法,
JNIEXPORT jobject JNICALL Java_projlib_DeserializeBuffer
(JNIEnv *env, jobject obj, jbyteArray inBufferData)
我创建了一个 unsigned char*
的列表,并使用从我的 C++ 代码 inBufferData
中提取的一些数据填充它
list<unsigned char*> returnBuffer
我想 return returnBuffer
到我的 Java 代码,其中它将是一个字节数组列表,List<byte[]>
。
请告诉我如何通过 JNI 通过 jobject
传递 unsigned char* 列表,然后在 Java 中获取它以进行进一步处理。
您将无法直接执行此操作。您必须在 C++ 中实例化所需 Java 列表实现的实例(因为 List
是一个接口),将其放入 jobject
中,然后将 jbytearray
项添加到它来自您的列表,然后 return 列表。
示例
由于我没有可用的 JNI 环境,此片段仅供参考(当您开始使用时请随意编辑),但您需要的可以通过以下方式实现:
jclass arrayListClass = env->FindClass("java/util/ArrayList"); // Find ArrayList class
jmethodID constructor = env->GetMethodID(arrayListClass, "<init>", "()V"); // Find ArrayList constructor
jobject arrayList = env->NewObject(arrayListClass, constructor); // Create new ArrayList instance
jmethodID add = env->GetMethodID(arrayListClass, "add", "(Ljava/lang/Object;)Z"); // Find the ArrayList::add method
jbyteArray item =env->NewByteArray(10); // Instantiate a new byte[]
env->CallBooleanMethod(arrayList, add, item); // Add the byte[] to the ArrayList
我有以下 JNI 方法,
JNIEXPORT jobject JNICALL Java_projlib_DeserializeBuffer
(JNIEnv *env, jobject obj, jbyteArray inBufferData)
我创建了一个 unsigned char*
的列表,并使用从我的 C++ 代码 inBufferData
中提取的一些数据填充它
list<unsigned char*> returnBuffer
我想 return returnBuffer
到我的 Java 代码,其中它将是一个字节数组列表,List<byte[]>
。
请告诉我如何通过 JNI 通过 jobject
传递 unsigned char* 列表,然后在 Java 中获取它以进行进一步处理。
您将无法直接执行此操作。您必须在 C++ 中实例化所需 Java 列表实现的实例(因为 List
是一个接口),将其放入 jobject
中,然后将 jbytearray
项添加到它来自您的列表,然后 return 列表。
示例
由于我没有可用的 JNI 环境,此片段仅供参考(当您开始使用时请随意编辑),但您需要的可以通过以下方式实现:
jclass arrayListClass = env->FindClass("java/util/ArrayList"); // Find ArrayList class
jmethodID constructor = env->GetMethodID(arrayListClass, "<init>", "()V"); // Find ArrayList constructor
jobject arrayList = env->NewObject(arrayListClass, constructor); // Create new ArrayList instance
jmethodID add = env->GetMethodID(arrayListClass, "add", "(Ljava/lang/Object;)Z"); // Find the ArrayList::add method
jbyteArray item =env->NewByteArray(10); // Instantiate a new byte[]
env->CallBooleanMethod(arrayList, add, item); // Add the byte[] to the ArrayList