最近、自分のプロジェクトで JNI の要求に応えました。ネイティブ メソッドに署名する方法がわかりません。 public void f(byte[] byte, Camera camera)
byte[]
さんの署名がであることは知って([B)V
いますが、カメラが本当に困っています。誰かこの署名を手伝ってくれませんか?
最近、自分のプロジェクトで JNI の要求に応えました。ネイティブ メソッドに署名する方法がわかりません。 public void f(byte[] byte, Camera camera)
byte[]
さんの署名がであることは知って([B)V
いますが、カメラが本当に困っています。誰かこの署名を手伝ってくれませんか?
署名は、ネイティブ側で何をしているかによって異なります。
C でカメラの readinf を行っていた場合、次のようになります。
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 ライブラリでカメラ/取得ストリームを最初に開く必要がある場合、これは 1 つの JNI 関数で実行し、別の JNI 関数で読み取るのが最適です。ネイティブ コードは 1 つの DLL/共有ライブラリにまとめられ、一度だけ読み込まれます。
Java から C コードへのカメラ インターフェースを動作させるのは難しくありません。
C コードは、Java コードのメソッドを呼び出すことができます。JNIメソッドでそれを行うと、かなり簡単です。
ライブラリから Java への非同期コールバックを試みることはお勧めしません。実行できますが、非常に時間がかかり、メモリリークを防ぐのは困難です。