2014-10-13 4 views
-1

JNI에서 C에서 Java까지 데이터 버퍼를 전달해야합니다. 그래서 C에서 직접 ByteBuffer을 작성 Java에 보낸 :직접 ByteBuffer 사용 방법

void *myBuffer = ...; 
int w = ..., h = ...; 

jmethodID func = ...; 
jobject directBuffer = jni_env->NewDirectByteBuffer(myBuffer, w * h); 
jni_env->CallVoidMethod(myActivity, func, directBuffer, w, h); 

Java 측면에서 내가 성공적으로 버퍼 있음을 받았지만, 나는 그것을 사용할 수 없습니다!

public static final void Func(final java.nio.ByteBuffer pixels, int w, int h) { 
    boolean ok = pixels.hasArray(); 
    if (ok) 
    { 
     java.nio.IntBuffer i_pixels = pixels.asIntBuffer(); 
     final int[] apixels = i_pixels.array(); 
     Bitmap bm = Bitmap.createBitmap(apixels, w, h, Bitmap.Config.ARGB_8888); 
    } 
    // ... 
} 

첫 번째 줄 (boolean ok = pixels.hasArray();)는 단지 UnsupportedOperationException와 충돌합니다.

위에서 알 수 있듯이 int[]으로 수신 버퍼를 변환하여 Bitmap.createBitmap으로 전달해야합니다. 내가 뭘 잘못하고 어떻게하면 될 수 있니? 그 때문에

+0

이 비트 보이기 :'jmethodID func = ...;' – weston

+0

또한 "Java 측에서 성공적으로 버퍼를 받았습니다"라고 어떻게 알았습니까? – weston

+0

@weston Debugger는'pixels'에 대한 올바른 버퍼 크기를 보여줍니다. 그리고'w'와'h'의 값도 정확합니다. 그 'func = ...'에는 아무런 문제가 없습니다. – Nick

답변

1

기본 관리 배열, 당신의 getInt 같은 가져 오기 기능을 통해 액세스 할 필요가()

SEE : https://groups.google.com/forum/#!topic/android-ndk/yNXuiQkGXPY

+0

고마워요. 그러나 배열로 전달하는 대신 백만 픽셀을 말하는 getInt를 호출하면 성능이 저하됩니다. 그리고'DirectByteBuffer'는 제 상황에서 의미없는 것처럼 보입니다. 그런 오버 헤드없이'C'''''''''''''''''' 데이터를 전달하는 다른 방법을 알고 있습니까? – Nick

+0

@Nick 'NewIntArray' &'SetIntArrayRegion'을 통해 네이티브 intArray를 할당하려고 시도 했습니까? 배열의 메모리 사용량을 두 배로 늘릴 수는 있지만 수명이 짧습니다. – Samhain

+0

예, 지금 시도 중입니다. 그것은 느린 처리 ​​('DirectByteBuffer' 사용) 또는 메모리 오버 헤드 (SetIntArrayRegion'에 의한) 중 슬픈 대안을 가지고있는 것 같습니다 ... 어쨌든 당신의 대답을 받아들이고 대단히 감사합니다. – Nick

0

당신이 jbyteArray 또는 jintarray 봤어? Java에서 byte[]c으로 전달하더라도 YuV를 RGB로 처리하는 데 사용합니다.