我最近在我的项目中遇到一个JNI的请求,我不知道如何签名我的native方法,就像 public void f(byte[] byte, Camera camera)
我知道byte[]
的签名是([B)V
,但是相机真的很困扰我,有人可以帮我处理这个签名吗?
我最近在我的项目中遇到一个JNI的请求,我不知道如何签名我的native方法,就像 public void f(byte[] byte, Camera camera)
我知道byte[]
的签名是([B)V
,但是相机真的很困扰我,有人可以帮我处理这个签名吗?
签名取决于您在本机端所做的事情。
如果你在 C 中做你的相机读取,那么它看起来像这样。
Java端的签名看起来像
class TestMe {
public native void acquireFromCamera(int camera, byte[] buffer);
}
Javah 制作了一个头文件,如
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class TestMe */
#ifndef _Included_TestMe
#define _Included_TestMe
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: TestMe
* Method: acquireFromCamera
* Signature: (I[B)V
*/
JNIEXPORT void JNICALL Java_TestMe_acquireFromCamera
(JNIEnv *, jobject, jint, jbyteArray);
#ifdef __cplusplus
}
#endifm
#endif
如果您将缓冲区数组从 Java 传递到 JNI,请不要忘记在传递之前锁定缓冲区。否则 GC 可能会在您采集时移动它。
C端调用参数为
(JNIEnv *myEnvironment, jobject this, jint camera, jbyteArray buffer);
如果你想使用的底层 C 函数看起来像这样模糊,这种接口效果很好......
void readCamera(int camera, unsigned char * data);
如果底层 C 库要求您首先打开相机/采集流,最好在一个 JNI 函数中完成并在另一个函数中读取。您的本机代码最终位于单个 DLL/共享库中,只会加载一次。
让相机接口工作从 Java 到 C 代码并不难。
您的 C 代码可以调用 Java 代码的方法。在您的 JNI 方法中执行此操作,并且非常轻松。
我不建议尝试从您的库到 Java 的异步回调。可以做到,但非常耗时,而且很难做到不泄漏内存。