1

バイト配列に保存しているカメラから画像を取得しています。このバイト配列をネイティブ関数に渡します。

問題:画像には、ネイティブ関数が気にしない色情報が含まれています。黒/白の情報は、アレイの前半にあります。

つまり、基本的に私がやりたいことは次のとおりです。

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

この背後にある理由は、jni関数の呼び出しが私の画像のメモリコピーを意味するためです。30 fpsの場合、画像の関連部分のみを渡すと、時間とメモリを節約できます。

ソリューションの制約は、両方のアレイが同じアレイ/メモリを指している必要があるということです。したがって、アレイの前半のコピーをより小さなアレイに作成することはオプションではありません。

このようなことはWeakReferenceで実行できますか?

4

3 に答える 3

2

長さと配列をネイティブメソッドに渡すという明白な答えさえ考慮していないようです。

于 2013-03-10T09:46:49.243 に答える
2

jniコードでGetByteArrayElementsを試してみてください。JVMの実装に応じて、配列をコピーするか、Javaメモリ内の配列への直接ポインタを提供します。私はそれをアンドロイドでのみ使用しました、そしてそれは私に直接のポインターを与えました、しかしそれが今HotSpotで働くかどうかはわかりません。

失敗した場合、nioダイレクトバッファは、コピーせずにjavaコードとjniコードの間でメモリを共有するもう1つの方法です。

于 2013-03-10T10:00:54.013 に答える
0

取得した画像をbyte[1000]配列に格納する代わりに、最初から2 byte [500]配列に格納してから、関心のある画像をネイティブ関数に渡すだけです。

あなたは次のようなヘルパークラスを作ることができます

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

配列の長さは型の一部ではないため、ここではキャストは役に立ちません。

于 2013-03-10T09:42:04.573 に答える