簡體   English   中英

寫入jfloat數組時“致命信號11(SIGSEGV)在0x00000010(代碼= 1)”

[英]Getting 'Fatal signal 11 (SIGSEGV) at 0x00000010 (code=1)' when writing into jfloat array

我目前正在用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)

之后,應用程序崩潰了。 我發現在寫入浮點值時總會出現這種情況。 閱讀不會導致崩潰。

我有什么不對嗎? 是不是可以寫出數組值?

我找到了解決方案! 出於某種原因,使用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);
   }

當我使用Android NDK ,我遇到了同樣的問題,我試圖釋放用C編寫的函數內部的內存,最后我得到了SIGSEGV錯誤。 我做的訣竅是在我的C代碼中創建一個處理內存的函數,並在我完成Java中的特定操作后直接從Java調用此方法。 我在C中調用了函數,以便清理內存。

我和你有同樣的問題,最后解決了。

我認為問題在於你沒有在jni的java代碼中初始化rgbObject。

我只是在我的代碼中添加rgbObject = new int [5]然后就可以了。

你也可以像TSGames所說的那樣做。

我覺得我更好。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM