2012-05-22 4 views
2

Android SDK 레벨과 Android NDK 레벨 사이에 바이트 버퍼를 보내려는 프로젝트에서 작업하고 있습니다.안드로이드에서 Honeycomb 아래의 Bytebuffer array() 메소드가 지원되지 않습니다.

권장되는 방법은 SDK 수준에서 즉 allocateDirect() 메소드를 사용하여 ByteBuffer를를 사용하는 것 같다가 수행

ByteBuffer frameBuf = ByteBuffer.allocateDirect(10000); 
int frameSize = fillMyArrayMethod(frameBuf.array()); 
UseArrayInNdk(frameBuf); 

모든 내 친구 그러나, 내 ICS 전화에 완벽한 일 안드로이드 2.3.3 버전 코드가 추락했다.

조사 결과, ByteBuffer의 array() 메소드는 2.3.3 버전의 Phone에서 UnsupportedOperationException을 던졌습니다.

분명히이 방법은 Honeycomb 아래의 Android 버전에서 지원되지 않습니다.

ByteBuffer frameBuf = ByteBuffer.allocateDirect(10000); 
Byte[] tmpBuf = new byte[10000]; 
int frameSize = fillMyArrayMethod(tmpBuf); 

for (int i=0; i<frameSize; i++) 
{ 
    frameBuf.put(i, tmpBuf[i]); 
} 
UseArrayInNdk(frameBuf); 
: 내 버퍼에 배열 포인터를 얻을 수

그래서 이제이 같은 즉, 내 NDK에서 사용하기 전에 내 배열의 모든 데이터를 추가로 넣어()을 강요하고있어

Android Honeycomb 이상에서 코드를 작성하는 것이 좋습니다. 추가 복사를 피하기 위해 2.3.3 및 더 아래에 더 똑똑한 방법이 있습니까?

답변

0

Dalvik 구현의 변경 사항은 ICS 이전에 직접 바이트 버퍼가 어레이에 의해 백업되지 않는다는 것입니다. 향후 버전에서는 array()를 호출 할 수 있다는 보장이 없습니다. ByteBuffer을 사용하기 전에 언제든지 hasArray()을 확인할 수 있습니다. 배열을 직접 사용할 수 없어도 ICS를 코딩 한 방법과 마찬가지로 일괄 put() 메서드를 항상 사용할 수 있으므로 루프로 호출 할 필요가 없습니다.

결론적으로 Android JNI 도움말 페이지에서 인용 해 드리겠습니다. Depending on how direct byte buffer access is implemented in the VM, accessing the data from code written in Java can be very slow.

관련 문제