0

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

我知道byte[]的签名是([B)V,但是相机真的很困扰我,有人可以帮我处理这个签名吗?

4

1 回答 1

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 函数中完成并在另一个函数中读取。您的本机代码最终位于单个 DLL/共享库中,只会加载一次。

让相机接口工作从 Java 到 C 代码并不难。

您的 C 代码可以调用 Java 代码的方法。在您的 JNI 方法中执行此操作,并且非常轻松。

我不建议尝试从您的库到 Java 的异步回调。可以做到,但非常耗时,而且很难做到不泄漏内存。

于 2012-10-16T04:01:32.570 回答