我刚开始与Android NDK工作,但我不断收到SIGSEGV时,我有我的C代码这一呼吁:

jobjectArray someStringArray;
someStringArray = (*env)->NewObjectArray(env, 10, 
(*env)->FindClass(env,"java/lang/String"),(*env)->NewStringUTF(env, ""));

此基础上所有我能找到的例子,上面的代码是正确的,但我不断收到SIGSERGV如果NewObjectArray行注释掉一切正常。任何想法可能是什么造成这样的问题?

有帮助吗?

解决方案

这看起来正确,所以我猜你做别的东西不对。我假设你正在使用checkjni上运行?您可能要打破成多行:做的findClass和检查返回值,执行NewStringUTF和检查返回值,然后调用NewObjectArray

顺便说一句,你可能想传递NULL作为最后一个参数;使用空字符串作为数组的每个元素的默认值的这种模式是常用的(我认为这是复制和一些Sun文档粘贴,并已蔓延从那里),但它很少有用,这是稍微浪费。 (和不匹配的 “新的String [10]” 在Java中的行为。)

其他提示

我想的可能原因之一是,在一个长期JNI方法,所述VM将中止每方法调用本地参考时隙用尽时(通常512时隙中的Android)。

由于的findClass()和NewStringUTF()函数将分配本地引用,如果你在很长一段时间JNI方法入住,VM不知道一个特定的本地引用是否应当回收或没有。所以,你应该明确地调用DeleteLocalRef时不再需要()来释放所获得的本地引用。如果你不这样做,“僵尸”局部引用将占据VM插槽,而所有的本地参考插槽运行了VM中止。

在短期JNI方法,这可能不是一个问题,由于所有的局部引用从JNI方法退出时将被回收利用。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top