Issue
I have following method in C++ native JNI :
extern "C" JNIEXPORT jintArray JNICALL
Java_com_haha_datastructuresample_MainActivity_arrayListFromJNI(
JNIEnv *env,
jobject) {
//---------------------ArrayList-----------------
auto *list = new ArrayList<int>();
list->size();
for (int i = 0; i < 100; ++i) {
list->add(i);
}
list->remove(99);
for (int i = 0; i < list->size(); ++i) {
LOGD("arr factor:%d", list->get(i));
}
jintArray arr = env->NewIntArray(list->size());
jint fill[list->size()];
for (int i = 0; i < list->size(); i++) {
fill[i] = list->get(i);
}
env->SetIntArrayRegion(arr, 0, list->size(), fill);
return arr;
//---------------------ArrayList-----------------
}
Here is Add method in ArrayList :
template<class E>
void ArrayList<E>::add(E e) {
ensureCapacityInternal(index + 1); // Increments modCount!!
array[index++] = e;
LOGD("add index:%d", index);
}
When I add item at this line app crashes :
array[index++] = e;
It just happens when I call JNI method in ClickListener in Kotlin :
list.onItemClickListener = AdapterView.OnItemClickListener { p0, p1, p2, p3 ->
val intent = Intent(this@MainActivity, DetailActivity::class.java)
val res = getString(R.string.array_print, arrayListFromJNI().joinToString { it.toString() })
intent.putExtra(EXTRA, res)
startActivity(intent)
}
Do you know how to fix it?
This is the crash log :
2020-03-24 15:56:38.254 18914-18914/com.haha.datastructuresample
A/libc: Fatal signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr 0xffffffffc2000004 in tid 18914 (structuresample), pid 18914 (structuresample)
2020-03-24 17:26:56.439 31006-31006/? A/DEBUG: *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***
2020-03-24 17:26:56.439 31006-31006/? A/DEBUG: Build fingerprint: 'google/walleye/walleye:10/QQ2A.200305.002/6138846:user/release-keys'
2020-03-24 17:26:56.439 31006-31006/? A/DEBUG: Revision: 'MP1'
2020-03-24 17:26:56.439 31006-31006/? A/DEBUG: ABI: 'arm64'
2020-03-24 17:26:56.440 31006-31006/? A/DEBUG: Timestamp: 2020-03-24 17:26:56+0430
2020-03-24 17:26:56.440 31006-31006/? A/DEBUG: pid: 30948, tid: 30948, name: structuresample >>> com.haha.datastructuresample <<<
2020-03-24 17:26:56.440 31006-31006/? A/DEBUG: uid: 10283
2020-03-24 17:26:56.440 31006-31006/? A/DEBUG: signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr 0xffffffffc2000004
2020-03-24 17:26:56.440 31006-31006/? A/DEBUG: x0 0000007c52191bf0 x1 0000000000000001 x2 0000007b66f309f5 x3 000000005245d020
2020-03-24 17:26:56.440 31006-31006/? A/DEBUG: x4 0000000000000000 x5 0000007c5216ec00 x6 0000007ff77fa3f0 x7 0000007ff77f5310
2020-03-24 17:26:56.440 31006-31006/? A/DEBUG: x8 0000000000000000 x9 0000007c52191bf0 x10 ffffffffc2000004 x11 0000000000000001
2020-03-24 17:26:56.440 31006-31006/? A/DEBUG: x12 0000000000000000 x13 0000000000000004 x14 0000000000000006 x15 ffffffffffffffff
2020-03-24 17:26:56.440 31006-31006/? A/DEBUG: x16 0000007b66f3ebd0 x17 0000007b66f12340 x18 0000007c52c1a000 x19 0000007c5216ec00
2020-03-24 17:26:56.440 31006-31006/? A/DEBUG: x20 0000000000000000 x21 0000007c5216ec00 x22 0000007ff77f5610 x23 0000007b675a717f
2020-03-24 17:26:56.440 31006-31006/? A/DEBUG: x24 0000000000000004 x25 0000007c5245d020 x26 0000007c5216ecb0 x27 0000000000000001
2020-03-24 17:26:56.440 31006-31006/? A/DEBUG: x28 0000007ff77f53a0 x29 0000007ff77f52a0
2020-03-24 17:26:56.440 31006-31006/? A/DEBUG: sp 0000007ff77f5270 lr 0000007b66f11884 pc 0000007b66f118ac
2020-03-24 17:26:56.632 31006-31006/? A/DEBUG: backtrace:
2020-03-24 17:26:56.632 31006-31006/? A/DEBUG: #00 pc 00000000000118ac /data/app/com.haha.datastructuresample-GwDwZVe9cBYUCJeWbnwXtg==/lib/arm64/libnative-lib.so (ArrayList<int>::add(int)+116) (BuildId: 654c5d2cacdf45f6d2dfd0f27cb27227cc7b303f)
2020-03-24 17:26:56.632 31006-31006/? A/DEBUG: #01 pc 00000000000115fc /data/app/com.haha.datastructuresample-GwDwZVe9cBYUCJeWbnwXtg==/lib/arm64/libnative-lib.so (Java_com_haha_datastructuresample_MainActivity_arrayListFromJNI+120) (BuildId: 654c5d2cacdf45f6d2dfd0f27cb27227cc7b303f)
2020-03-24 17:26:56.632 31006-31006/? A/DEBUG: #02 pc 000000000013f350 /apex/com.android.runtime/lib64/libart.so (art_quick_generic_jni_trampoline+144) (BuildId: 62f6757870ddffe01b8bd186ef2e4a7e)
2020-03-24 17:26:56.632 31006-31006/? A/DEBUG: #03 pc 0000000000136334 /apex/com.android.runtime/lib64/libart.so (art_quick_invoke_stub+548) (BuildId: 62f6757870ddffe01b8bd186ef2e4a7e)
2020-03-24 17:26:56.632 31006-31006/? A/DEBUG: #04 pc 00000000001450ac /apex/com.android.runtime/lib64/libart.so (art::ArtMethod::Invoke(art::Thread*, unsigned int*, unsigned int, art::JValue*, char const*)+244) (BuildId: 62f6757870ddffe01b8bd186ef2e4a7e)
2020-03-24 17:26:56.632 31006-31006/? A/DEBUG: #05 pc 00000000002e2660 /apex/com.android.runtime/lib64/libart.so (art::interpreter::ArtInterpreterToCompiledCodeBridge(art::Thread*, art::ArtMethod*, art::ShadowFrame*, unsigned short, art::JValue*)+384) (BuildId: 62f6757870ddffe01b8bd186ef2e4a7e)
2020-03-24 17:26:56.632 31006-31006/? A/DEBUG: #06 pc 00000000002dd6ec /apex/com.android.runtime/lib64/libart.so (bool art::interpreter::DoCall<false, false>(art::ArtMethod*, art::Thread*, art::ShadowFrame&, art::Instruction const*, unsigned short, art::JValue*)+900) (BuildId: 62f6757870ddffe01b8bd186ef2e4a7e)
2020-03-24 17:26:56.632 31006-31006/? A/DEBUG: #07 pc 00000000005a27b8 /apex/com.android.runtime/lib64/libart.so (MterpInvokeDirect+400) (BuildId: 62f6757870ddffe01b8bd186ef2e4a7e)
2020-03-24 17:26:56.632 31006-31006/? A/DEBUG: #08 pc 0000000000130914 /apex/com.android.runtime/lib64/libart.so (mterp_op_invoke_direct+20) (BuildId: 62f6757870ddffe01b8bd186ef2e4a7e)
2020-03-24 17:26:56.632 31006-31006/? A/DEBUG: #09 pc 0000000000155f84 [anon:dalvik-classes.dex extracted in memory from /data/app/com.haha.datastructuresample-GwDwZVe9cBYUCJeWbnwXtg==/base.apk] (com.haha.datastructuresample.MainActivity.access$arrayListFromJNI)
2020-03-24 17:26:56.632 31006-31006/? A/DEBUG: #10 pc 00000000005a32c0 /apex/com.android.runtime/lib64/libart.so (MterpInvokeStatic+1136) (BuildId: 62f6757870ddffe01b8bd186ef2e4a7e)
2020-03-24 17:26:56.632 31006-31006/? A/DEBUG: #11 pc 0000000000130994 /apex/com.android.runtime/lib64/libart.so (mterp_op_invoke_static+20) (BuildId: 62f6757870ddffe01b8bd186ef2e4a7e)
2020-03-24 17:26:56.632 31006-31006/? A/DEBUG: #12 pc 0000000000155ebe [anon:dalvik-classes.dex extracted in memory from /data/app/com.haha.datastructuresample-GwDwZVe9cBYUCJeWbnwXtg==/base.apk] (com.haha.datastructuresample.MainActivity$onCreate$1.onItemClick+34)
2020-03-24 17:26:56.632 31006-31006/? A/DEBUG: #13 pc 00000000005a4fe0 /apex/com.android.runtime/lib64/libart.so (MterpInvokeInterfaceRange+1376) (BuildId: 62f6757870ddffe01b8bd186ef2e4a7e)
2020-03-24 17:26:56.632 31006-31006/? A/DEBUG: #14 pc 0000000000130d14 /apex/com.android.runtime/lib64/libart.so (mterp_op_invoke_interface_range+20) (BuildId: 62f6757870ddffe01b8bd186ef2e4a7e)
2020-03-24 17:26:56.632 31006-31006/? A/DEBUG: #15 pc 000000000021513c /system/framework/framework.jar (android.widget.AdapterView.performItemClick+28)
2020-03-24 17:26:56.632 31006-31006/? A/DEBUG: #16 pc 00000000005a4610 /apex/com.android.runtime/lib64/libart.so (MterpInvokeSuperRange+1936) (BuildId: 62f6757870ddffe01b8bd186ef2e4a7e)
2020-03-24 17:26:56.632 31006-31006/? A/DEBUG: #17 pc 0000000000130b94 /apex/com.android.runtime/lib64/libart.so (mterp_op_invoke_super_range+20) (BuildId: 62f6757870ddffe01b8bd186ef2e4a7e)
2020-03-24 17:26:56.632 31006-31006/? A/DEBUG: #18 pc 0000000000205f08 /system/framework/framework.jar (android.widget.AbsListView.performItemClick+384)
2020-03-24 17:26:56.632 31006-31006/? A/DEBUG: #19 pc 00000000005a0730 /apex/com.android.runtime/lib64/libart.so (MterpInvokeVirtual+1432) (BuildId: 62f6757870ddffe01b8bd186ef2e4a7e)
2020-03-24 17:26:56.632 31006-31006/? A/DEBUG: #20 pc 0000000000130814 /apex/com.android.runtime/lib64/libart.so (mterp_op_invoke_virtual+20) (BuildId: 62f6757870ddffe01b8bd186ef2e4a7e)
2020-03-24 17:26:56.632 31006-31006/? A/DEBUG: #21 pc 0000000000203190 /system/framework/framework.jar (android.widget.AbsListView$PerformClick.run+120)
2020-03-24 17:26:56.632 31006-31006/? A/DEBUG: #22 pc 00000000005a0730 /apex/com.android.runtime/lib64/libart.so (MterpInvokeVirtual+1432) (BuildId: 62f6757870ddffe01b8bd186ef2e4a7e)
2020-03-24 17:26:56.632 31006-31006/? A/DEBUG: #23 pc 0000000000130814 /apex/com.android.runtime/lib64/libart.so (mterp_op_invoke_virtual+20) (BuildId: 62f6757870ddffe01b8bd186ef2e4a7e)
2020-03-24 17:26:56.632 31006-31006/? A/DEBUG: #24 pc 0000000000209940 /system/framework/framework.jar (android.widget.AbsListView.onTouchUp+748)
2020-03-24 17:26:56.632 31006-31006/? A/DEBUG: #25 pc 00000000005a2ab8 /apex/com.android.runtime/lib64/libart.so (MterpInvokeDirect+1168) (BuildId: 62f6757870ddffe01b8bd186ef2e4a7e)
2020-03-24 17:26:56.632 31006-3100
Solution
The problem is not in the JNI part at all, but in your ArrayList code: constructors should always fill out every field. The reason your code crashes there is because array
is very probably random heap memory instead of NULL
.
You need to make at least the following modifications to make your calling code not crash:
template<class E>
ArrayList<E>::ArrayList()
: array(nullptr), length(0) {
}
template<class E>
ArrayList<E>::ArrayList(int len)
: length(len) {
array = len > 0 ? new E[len] : nullptr;
}
template<class E>
ArrayList<E>::~ArrayList() {
delete[] array;
}
and you should definitely be compliant to the rule of three/five by overriding the copy constructor and assignment operator.
Answered By - Botje
0 comments:
Post a Comment
Note: Only a member of this blog may post a comment.