JNI相机签名

时间:2012-10-16 02:09:27

标签: java-native-interface signature

我最近在我的项目中遇到了JNI的请求,我不知道如何签署我的原生方法,就像public void f(byte[] byte, Camera camera)

我知道byte[]的签名是([B)V,但相机确实让我很烦恼,有人可以帮我签名吗?

1 个答案:

答案 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进行异步回调。它可以完成但非常耗时且难以避免泄漏内存。

相关问题