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
我有一个以 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