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

JNI -> how to wrap c++ void*

我有一个以 void* 作为参数的 c++ 函数。如何将其包装在 java?

C++

void foo(void* data)
{
}

Java

void foo(Object[] data)
{
}

我不确定。请帮忙。

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

void foo(Byte[] data) {
}

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

如果"wrap it in java",你的意思是"call it from Java",你需要创建一个java class,并声明一个本地方法。除非您想将 java 对象作为参数传递,否则静态更容易:

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

其次,运行 javah 在 class 文件中。它将生成一个 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