我最近在我的项目中遇到了JNI的请求,我不知道如何签署我的原生方法,就像public void f(byte[] byte, Camera camera)
我知道byte[]
的签名是([B)V
,但相机确实让我很烦恼,有人可以帮我签名吗?
答案 0 :(得分:0)
签名取决于您在本机方面所做的事情。
如果您在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函数中完成并在另一个JNI函数中读取。 您的本机代码最终只在一个DLL /共享库中加载一次。
将相机接口从Java转换为C代码并不难。
您的C代码可以调用Java代码上的方法。在你的JNI方法中做它并且它非常轻松。
我不建议尝试从库到Java进行异步回调。它可以完成但非常耗时且难以避免泄漏内存。