0

最近、自分のプロジェクトで JNI の要求に応えました。ネイティブ メソッドに署名する方法がわかりません。 public void f(byte[] byte, Camera camera)

byte[]さんの署名がであることは知って([B)Vいますが、カメラが本当に困っています。誰かこの署名を手伝ってくれませんか?

4

1 に答える 1

0

署名は、ネイティブ側で何をしているかによって異なります。

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 への非同期コールバックを試みることはお勧めしません。実行できますが、非常に時間がかかり、メモリリークを防ぐのは困難です。

于 2012-10-16T04:01:32.570 に答える