2013-11-22 4 views
4

Я планирую сделать снимок с помощью телефона камеры (Android), а затем передать его функции C через JNI. Функция C генерируется MATLAB Coder.Как преобразовать byte [] в Android в uint8_T массив в C?

Вот заголовок создаваемой функции C:

real_T detection(const **uint8_T** OriginalImage[28755648]) 

Вот тип данных изображения:

@Override 
    public void onPictureTaken(**byte[] data**, Camera camera) {.....} 

Вопрос: Как преобразовать байт [], чтобы uint8_t массив? Я нашел how to convert byte[] to jbyte * .. но я не знаю, как иметь дело с uint8_T?

Я знаю только Java, но не C.

С уважением,

+1

Почему вы так хотите, вы пытаетесь преобразовать байт [] в unsigned char array, его диапазон находится в пределах 0-255 –

+0

@Arju I (есть), чтобы преобразовать его, потому что большую часть времени мы не можем просто использовать данные Java типы непосредственно в C. Например, мы должны преобразовать java.lang.String в char *, прежде чем мы сможем эффективно использовать его в C. Я что-то пропустил? – user3020258

ответ

4

Java не имеют беззнаковых целых типов, но камера не очень волнует. Вы можете безопасно отобразить массив байтов, который поступает с onPictureTaken() обратным вызовом на uint8_t*.

Sidenote: Скорее всего, изображение поступит как поток JPEG.

Обновление: Пример реализации onPictureTaken() в C.

Вот что у вас есть где-то в вашей деятельности:

mCamera = Camera.open(); 
mCamera.setPreviewDisplay(surfaceHolder); 
mCamera.startPreview(); 
... 
mCamera.takePicture(null, null, new android.hardware.Camera.NativePictureCallback); 

Вот файл SRC/Android/оборудование/Camera/NativePictureCallback.java:

package android.hardware.Camera; 
class NativePictureCallback: implements PictureCallback { 
    static { 
    System.loadLibrary("NativeCamera"); 
    } 
    public void native onPictureTaken(byte[] data, Camera camera); 
} 

И вот C, который является частью libNativeCamera.so:

include <jni.h> 
include <tmwtypes.h> 

real_T detection(const uint8_T* OriginalImage); 

JNIEXPORT void JNICALL 
Java_android_hardware_Camera_NativePictureCallback_onPictureTaken(
    JNIEnv* env, jobject thiz, jbytearray data, jobject camera) { 
    jbyte* dataPtr = (*env)->GetByteArrayElements(env, data, NULL); 
    real_T res = detection((const uint8_T*)dataPtr); 
    (*env)->ReleaseByteArrayElements(env, data, dataPtr, JNI_ABORT); 
} 
+0

Не могли бы вы дать мне пример, чтобы сделать его более понятным для меня? Должен ли я делать литье внутри onPictureTaken()? Если да, то как это сделать, пока uint8_t * не поддерживается в Java. Спасибо – user3020258

+0

@zharf Я нашел ваш ответ здесь: http://stackoverflow.com/a/16668081/3020258, который связан с моим вопросом, за исключением того, что у меня есть код C, а ваш - C++. Не могли бы вы помочь мне, какие изменения я должен внести, чтобы сделать его подходящим для моего кода? – user3020258

+0

О, вам нужен полный код для обертки ... См. Обновленный ответ, как только я нахожу полноразмерную клавиатуру для его ввода. –

Смежные вопросы