5

我目前正在使用 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 (code=1)

之后,应用程序崩溃。我发现它总是在写入浮点值时发生。阅读不会导致崩溃。

我有什么问题吗?不能写数组值吗?

4

3 回答 3

3

我找到了解决方案!出于某种原因,该函数是用一个空值作为数组调用的。但是, 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);
   }
于 2012-09-27T11:34:50.903 回答
1

我在使用 时遇到了同样的问题Android NDK,我试图释放用 编写的函数内的内存C,但最终得到了SIGSEGV错误。我所做的技巧是在我的 C 代码中创建一个处理内存的函数,并Java在我完成 Java 中的特定操作后直接从 调用此方法。我在 C 中调用了该函数,以清理内存。

于 2012-09-27T11:19:06.353 回答
0

我和你有同样的问题,终于解决了。

我认为问题在于您的 java 代码中没有为 jni 初始化 rgbObject。

i just add rgbObject =new int[5] in my code and then it is OK.

you can also do as TSGames said.

i think my is better.

于 2014-10-12T08:47:51.470 回答