2016-08-16 14 views
2

オブジェクトの割り当てにネイティブレイヤーを使用しようとしています。たとえば:Android Native:ネイティブレイヤーから返ってオブジェクトを解放する方法

JNIEXPORT jobject JNICALL 
Java_memory_hqt_com_heapsizetesting_jnitest_JNIActivity_getBigDataFromJni(JNIEnv *env, jobject instance, jint memory) { 

    unsigned char* buffer = (unsigned char*) malloc(memory); 
    jobject directBuffer = (*env)->NewDirectByteBuffer(env, buffer, memory); 
    return directBuffer; 
} 

そして私は、Java層で再びデータを取得する:私が知っているように、ネイティブオブジェクトがガベージコレクタによって管理されていない

public native Object getBigDataFromJni(int memory); 
ByteBuffer data = (ByteBuffer) getBigDataFromJni(1024); 

。だから私の質問は:どのように私はデータオブジェクトを完了した後にメモリを取り戻すことができます。

+1

ネイティブコードでダイレクトByteBufferを作成する理由は何ですか? –

答えて

3

ネイティブバッファを使用すると、bufferポインタをjlongにキャストし、JavaレイヤーにJavaを長くして戻します。これを済ませたら、それを元のレイヤーに戻しますそれをポインタにキャストし、そのポインタでfree()を呼び出します。

注:私はAndroidでこれを試みたことはありませんが、通常はLinux、さまざまなUnixes、Windowsで動作します。

関連する問題