これは、私が使用しているコードの簡略化されたバージョンです
ジャワ:
private native void malloc(int bytes);
private native void free();
// this is called when I want to create a very large buffer in native memory
malloc(32 * 1024 * 1024);
// EDIT: after allocating, we need to initialize it before Android sees it as anythign other than a "reservation"
memset(blob, '\0', sizeof(char) * bytes);
...
// and when I'm done, I call this
free()
子:
static char* blob = NULL;
void Java_com_example_MyClass_malloc(JNIEnv * env, jobject this, jint bytes)
{
blob = (char*) malloc(sizeof(char) * bytes);
if (NULL == blob) {
__android_log_print(ANDROID_LOG_DEBUG, DEBUG_TAG, "Failed to allocate memory\n");
} else {
char m[50];
sprintf(m, "Allocated %d bytes", sizeof(char) * bytes);
__android_log_print(ANDROID_LOG_DEBUG, DEBUG_TAG, m);
}
}
void Java_com_example_MyClass_free(JNIEnv * env, jobject this)
{
free(blob);
blob = NULL;
}
ここで、MyClass.java から malloc() を呼び出すと、32M のメモリが割り当てられ、使用可能なメモリがどこかで減少していることを確認できるはずです。adb shell dumpsys meminfo
ただし、またはのいずれかで、その兆候は見られませんでしたadb shell cat /proc/meminfo
。私は C の初心者ですが、Java の経験は豊富です。テスト目的で、Dalvik のヒープの外に大量のメモリを割り当てようとしています (したがって、Android/dalvik によって管理されません)。Hackbod のおかげで、現在 Android はネイティブ コードに割り当てられているメモリの量に制限を設けていないので、これが正しいアプローチのようです。私はこれを正しく行っていますか?