2016-08-16 9 views
1

Androidは、1つのプロセスでJavaヒープサイズを制限しています。しかし、ネイティブレイヤーの下に割り当てると、(使用可能なメモリよりも大きい場合を除いて)必要な数だけ割り当てることができます。Android Native:ネイティブレイヤーの下に大きなメモリを割り当てることができません

だから、私はこれのためのテストを書いています。

まず、私は私が割り当てることのできる最大メモリを作成します。第二に、私はこのサイズでネイティブのメモリを割り当てる

ActivityManager am = (ActivityManager) getSystemService(ACTIVITY_SERVICE); 
int realAllowMemory = am.getMemoryClass(); 

JNIEXPORT jbyteArray JNICALL 
Java_memory_hqt_com_heapsizetesting_jnitest_JNIActivity_getBigDataFromJni(JNIEnv *env, jobject instance, jint memory) { 
    jbyteArray ret = (*env)->NewByteArray(env, memory); 
    return ret; 
} 

そして、私はすることによって、このメソッドを呼び出します。

public native byte[] getBigDataFromJni(int memory); 


    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     getBigDataFromJni(realAllowMemory * 1000 * 1000); 
    } 

私がこれをするとき、私は例外を満たすでしょう:

JNIは、アプリケーションでエラーを検出:JNI NewByteArrayは 保留中の例外を除いていわゆる 'java.lang.OutOfMemoryErrorを' バイト[] memory.hqt.com.heapsizetesting.jnitest.JNIActivity.getBigDataFromJni(int型)でスロー: - 2

私がテストしたように、realAllowMemoryは約256MBですが、使用可能なメモリは約1000MBです。この時点で私に説明してください。

答えて

4

ネイティブパーツでJavaの割り当て方法を呼び出しています。 Javaコードと同じ制限があります。それを回避するには、malloc()などのネイティブの割り当て関数を使用します。

+0

ありがとうございます:DあなたはJavaレイヤー上でオブジェクトを解放する方法を教えてください。ありがとうございます: "D –

+0

あなたはjavaからどのように' free() 'を呼び出すのですか?' malloc() '呼び出しと同様にjniメソッドで' free() '呼び出しをラップすることができます –

関連する問題