JNI -> 如何包装 c++ void*

JNI -> how to wrap c++ void*

本文关键字:包装 c++ void 何包装 gt JNI      更新时间:2023-10-16

我有一个以void*为参数的c++函数。如何用java封装它?

C++

void foo(void* data)
{
}

Java

void foo(Object[] data)
{
}

我不确定。请帮忙。

我能想到的(我不太精通该语言)最接近java代码的是

void foo(Byte[] data) {
}

虽然您不知道字节数组的实际大小,但需要从通过JNI调用的foo()函数中了解这一点。

如果所说的"用java包装它"是指"从java调用它",则需要创建一个java类,并声明一个本地方法。静态更容易,除非您想将java对象作为参数传递:

package my.package;
public class Foo {
public static native void foo(byte[] bytes);
}

其次,在类文件上运行javah。它将生成一个C头,如:

/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class net_redpoint_utils_Scratch */
#ifndef _Included_net_redpoint_utils_Scratch
#define _Included_net_redpoint_utils_Scratch
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     my_package_Scratch
 * Method:    foo
 * Signature: ([B)V
 */
JNIEXPORT void JNICALL Java_my_package_Scratch_foo
  (JNIEnv *, jclass, jbyteArray);
#ifdef __cplusplus
}
#endif
#endif

您需要使用完全相同的名称、签名等来实现该函数。jbyteArray是byte[]参数的JNI类型。

PS:查看SWIG