我有代码块,在Android NDK中分配了大量的内存。最后我需要的是使用try-catch块的可能性,可能有NoMemoryError。你知道怎么用原生SDK写吗?
我需要实现与此相同的功能:
for(int i=1;i<50;i++){
try{
int[] mega =new int[i*1024*1024];//1MB
}catch (OutOfMemoryError e) {
usedMemory= (Runtime.getRuntime().totalMemory()-Runtime.getRuntime().freeMemory())/new Float(1048576.0);
usedText=usedMemory+" MB";
tw.setText(usedText);
break;
}
}
答案 0 :(得分:4)
在您的JNI函数中,您可以使用以下代码段抛出java异常。编译本机代码时,请确保启用RTTI和异常。
try {
int *mega = new int[1024 * 1024];
} catch (std:: bad_alloc &e) {
jclass clazz = jenv->FindClass("java/lang/OutOfMemoryError");
jenv->ThrowNew(clazz, e.what());
}
在Java中,您只需捕获OutOfMemoryError。
try {
// Make JNI call
} catch (OutOfMemoryError e) {
//handle error
}
答案 1 :(得分:1)
Android是not very friendly to C++ exceptions(您必须链接Android提供的特殊版本的C ++库才能有例外)。也许您应该使用malloc()并检查其返回值以查看内存分配是否正常?
答案 2 :(得分:1)