2012-10-16 60 views
0

最近我滿足我的項目JNI的要求,我不知道如何簽名我的本地方法,這就像public void f(byte[] byte, Camera camera)JNI相機簽名

我知道byte[]的簽名爲([B)V,但相機真麻煩我,任何人都可以請這個簽名幫我嗎?

回答

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函數(S)看上去隱約像這樣...

無效readCamera(INT相機,無符號字符*數據);

如果底層C庫要求您首先打開相機/採集流,最好在一個JNI函數中完成並在另一箇中讀取。 您的本地代碼最終會在單個DLL /共享庫中只加載一次。

從Java到C代碼的相機接口工作不難。

你的C代碼可以調用Java代碼的方法。用你的JNI方法來做,這是非常痛苦的。

我不會建議嘗試從您的庫到Java執行異步回調。它可以完成,但是非常耗時,難以泄漏內存。

+0

非常感謝你,我會盡快試用:) – wayne

+0

我嘗試javah與對象相機相機,它結束了「Landroid /硬件/相機;」 ,最後... :) – wayne