我目前正在用ndk实现一个android函数。 我在java中声明了函数
public static native void calculate(float[] rgb,float factor);
然后,我写了C函数:
JNIEXPORT void JNICALL Java_<package>_calculate(
JNIEnv * env,
jobject object,
jfloatArray rgbObject,
jfloat factor){
jfloat* rgb = (*env)->GetFloatArrayElements(env,rgbObject,0);
if(rgb==NULL) return;
rgb[0]=5; // Test, crash!
(*env)->ReleaseFloatArrayElements(env,rgb,rgbObject,0);
}
但是,每当我尝试使用数组和某个值调用该函数时,我都会收到logcat消息:
A / libc(16064):致命信号11(SIGSEGV)位于0x00000010(代码= 1)
之后,应用程序崩溃了。我发现在写入浮点值时总会出现这种情况。阅读不会导致崩溃。
我有什么不对吗?是不是可以写出数组值?
答案 0 :(得分:3)
我找到了解决方案! 出于某种原因,使用null值作为数组调用该函数。但是,rgb == NULL检查没有被触发(我不知道是出于哪个原因)。我通过在获取值
之前添加第二个检查来解决问题JNIEXPORT void JNICALL Java_<package>_calculate(
JNIEnv * env,
jobject object,
jfloatArray rgbObject,
jfloat factor){
if(rgbObject==NULL) return; // Check if incomming array is NULL-Pointer
jfloat* rgb = (*env)->GetFloatArrayElements(env,rgbObject,0);
if(rgb==NULL) return;
rgb[0]=5; // Test, crash!
(*env)->ReleaseFloatArrayElements(env,rgb,rgbObject,0);
}
答案 1 :(得分:1)
当我使用Android NDK
时遇到了同样的问题,我尝试释放C
中编写的函数内的内存,最后得到SIGSEGV
错误。我做的诀窍是在我的C代码中创建一个处理内存的函数,并在我完成Java中的特定操作后直接从Java
调用此方法。我在C中调用了函数,以便清理内存。
答案 2 :(得分:0)
我和你有同样的问题并最终解决它。
我认为问题在于你没有在java代码中为jni初始化rgbObject。
我只是在我的代码中添加rgbObject = new int [5]然后就可以了。
你也可以像TSGames所说的那样做。
我认为我的感觉更好。