[英]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.