2013-03-10 3 views
1

바이트 배열로 저장 한 카메라의 이미지가 나타납니다. 이 바이트 배열을 네이티브 함수에 전달하고 있습니다.배열을 더 작은 크기 배열로 캐스팅

문제점 : 이미지에 기본 기능이 신경 쓰지 않는 색상 정보가 포함되어 있습니다. 흑백 정보는 배열의 전반부에 있습니다.

그래서 기본적으로 내가하고 싶은 것이있다 :이 뒤에

byte[1000] image; 
nativecall((byte[500])image); 

이유는 JNI 함수를 호출 내 이미지의 memcopy을 의미한다는 것이다. 30fps를 사용하면 이미지의 관련 부분 만 통과하면 시간과 메모리를 절약 할 수 있습니다.

모든 솔루션의 제약은 두 배열이 모두 동일한 배열/메모리를 가리켜 야한다는 것입니다. 따라서 배열의 전반부를 더 작은 배열에 단순히 복사하는 것은 옵션이 아닙니다.

WeakReference를 사용하여 수행 할 수 있습니까?

+0

JNI를 사용하지 않고 오랜 시간이 지났지 만 의미있는 정보가 시작되는 배열에서 배열과 인덱스를 단순히 전달할 수는 없었습니까? 네이티브 코드는 관련 부분의 복사본 만 만들 수 있습니다. –

답변

2

jni 코드에서 GetByteArrayElements 시도하십시오. JVM 구현에 따라 배열을 복사하거나 자바 메모리에 직접 포인터를 제공합니다. 안드로이드에서만 사용했고, 직접 포인터를주었습니다.하지만 HotSpot에서 지금 작동하는지 모르겠습니다.

실패한 경우 nio direct buffers은 복사하지 않고 java와 jni 코드간에 메모리를 공유하는 또 다른 방법입니다.

+0

직접 버퍼로 nio를 사용하는 것이 실제로 문제에 대한 최상의 해결책이라고 생각합니다. – tmanthey

0

바이트 [1000] 배열로 저장하는 대신, 처음부터 2 바이트 [500]로 저장 한 다음 관심이있는 이미지를 네이티브 함수로 전달하면됩니다. 배열 길이는 유형의 일부가 아니기 때문에

당신은

class MyImage { 
    public byte[500] grayInfo; 
    public byte[500] colorInfo; 
} 

같은 헬퍼 클래스를 만들 수 있습니다, 캐스팅 여기에 도움이되지 수 있습니다.

2

네이티브 메소드에 길이와 배열을 전달하는 명백한 답을 고려하지 않은 것 같습니다.

관련 문제