hi:
I build libcaffe.so and libcaffe_jni.so with cmake 3.5.2 ,ndk r11c,and master branch of caffe-android-lib. I set $ANDROID_ABI=x86_64, and finally get the .SO compiled.
Then I copy libcaffe.so and libcaffe_jni.so to the path caffe-android-demo/app/src/main/jniLibs/x86_64, and debug the app with androidStudio 2.1 and a x86_64 emulator (api level 22). I use ndk r11c in androidStudio by setting the path of ndk in project structure.
I use jdk1.8.0_101 in both compile tasks.
When then CNNTask start,in function
public int[] predictImage(String imgPath) {
//return predictImage(imgPath, 1);
return predictImage("/storage/sdcard/Pictures/Caffe-Android-Demo/cat.jpg",1);
}
I get a JNI error like this:
09-21 22:57:50.069 10464-11287/com.sh1r0.caffe_android_demo A/art: art/runtime/check_jni.cc:65] JNI DETECTED ERROR IN APPLICATION: jarray argument has non-array type: java.lang.String
09-21 22:57:50.069 10464-11287/com.sh1r0.caffe_android_demo A/art: art/runtime/check_jni.cc:65] in call to GetByteArrayElements
09-21 22:57:50.069 10464-11287/com.sh1r0.caffe_android_demo A/art: art/runtime/check_jni.cc:65] from int[] com.sh1r0.caffe_android_lib.CaffeMobile.predictImage(java.lang.String, int)
09-21 22:57:50.069 10464-11287/com.sh1r0.caffe_android_demo A/art: art/runtime/check_jni.cc:65] "AsyncTask #1" prio=5 tid=15 Runnable
09-21 22:57:50.069 10464-11287/com.sh1r0.caffe_android_demo A/art: art/runtime/check_jni.cc:65] | group="main" sCount=0 dsCount=0 obj=0x12c07fa0 self=0x7f5333ca5800
09-21 22:57:50.069 10464-11287/com.sh1r0.caffe_android_demo A/art: art/runtime/check_jni.cc:65] | sysTid=11287 nice=10 cgrp=default sched=0/0 handle=0x7f532a449000
09-21 22:57:50.069 10464-11287/com.sh1r0.caffe_android_demo A/art: art/runtime/check_jni.cc:65] | state=R schedstat=( 0 0 0 ) utm=0 stm=0 core=1 HZ=100
09-21 22:57:50.069 10464-11287/com.sh1r0.caffe_android_demo A/art: art/runtime/check_jni.cc:65] | stack=0x7f52ddafe000-0x7f52ddb00000 stackSize=1036KB
09-21 22:57:50.069 10464-11287/com.sh1r0.caffe_android_demo A/art: art/runtime/check_jni.cc:65] | held mutexes= "mutator lock"(shared held)
09-21 22:57:50.069 10464-11287/com.sh1r0.caffe_android_demo A/art: art/runtime/check_jni.cc:65] native: #00 pc 00006f79 /system/lib64/libbacktrace_libc++.so (UnwindCurrent::Unwind(unsigned long, ucontext_)+57)
09-21 22:57:50.069 10464-11287/com.sh1r0.caffe_android_demo A/art: art/runtime/check_jni.cc:65] native: #1 pc 00399a20 /system/lib64/libart.so (art::DumpNativeStack(std::_1::basic_ostream<char, std::1::char_traits >&, int, char const, art::mirror::ArtMethod)+96)
09-21 22:57:50.069 10464-11287/com.sh1r0.caffe_android_demo A/art: art/runtime/check_jni.cc:65] native: #2 pc 003682e7 /system/lib64/libart.so (art::Thread::Dump(std::1::basic_ostream<char, std::1::char_traits >&) const+215)
09-21 22:57:50.069 10464-11287/com.sh1r0.caffe_android_demo A/art: art/runtime/check_jni.cc:65] native: #3 pc 0010ff62 /system/lib64/libart.so (art::JniAbort(char const, char const)+946)
09-21 22:57:50.069 10464-11287/com.sh1r0.caffe_android_demo A/art: art/runtime/check_jni.cc:65] native: #4 pc 001109ec /system/lib64/libart.so (art::JniAbortF(char const, char const, ...)+220)
09-21 22:57:50.069 10464-11287/com.sh1r0.caffe_android_demo A/art: art/runtime/check_jni.cc:65] native: #5 pc 00114ddc /system/lib64/libart.so (art::ScopedCheck::Check(bool, char const, ...) (.constprop.133)+1196)
09-21 22:57:50.069 10464-11287/com.sh1r0.caffe_android_demo A/art: art/runtime/check_jni.cc:65] native: #6 pc 00119f1a /system/lib64/libart.so (art::CheckJNI::GetByteArrayElements(JNIEnv, jbyteArray, unsigned char*)+74)
09-21 22:57:50.069 10464-11287/com.sh1r0.caffe_android_demo A/art: art/runtime/check_jni.cc:65] native: #7 pc 0000c0c3 /data/app/com.sh1r0.caffe_android_demo-2/lib/x86_64/libcaffe_jni.so (imgbuf2mat+51)
09-21 22:57:50.069 10464-11287/com.sh1r0.caffe_android_demo A/art: art/runtime/check_jni.cc:65] native: #8 pc 0000c344 /data/app/com.sh1r0.caffe_android_demo-2/lib/x86_64/libcaffe_jni.so (getImage+132)
09-21 22:57:50.069 10464-11287/com.sh1r0.caffe_android_demo A/art: art/runtime/check_jni.cc:65] native: #9 pc 0000c925 /data/app/com.sh1r0.caffe_android_demo-2/lib/x86_64/libcaffe_jni.so (Java_com_sh1r0_caffe_1android_1lib_CaffeMobile_predictImage+69)
09-21 22:57:50.069 10464-11287/com.sh1r0.caffe_android_demo A/art: art/runtime/check_jni.cc:65] native: #10 pc 000013a4 /data/data/com.sh1r0.caffe_android_demo/cache/slice-slice_7-classes.dex (Java_com_sh1r0_caffe_1android_1lib_CaffeMobile_predictImage__Ljava_lang_String_2I+216)
09-21 22:57:50.069 10464-11287/com.sh1r0.caffe_android_demo A/art: art/runtime/check_jni.cc:65] native: #11 pc 00100e7f stack:11287
09-21 22:57:50.069 10464-11287/com.sh1r0.caffe_android_demo A/art: art/runtime/check_jni.cc:65] at com.sh1r0.caffe_android_lib.CaffeMobile.predictImage(Native method)
09-21 22:57:50.069 10464-11287/com.sh1r0.caffe_android_demo A/art: art/runtime/check_jni.cc:65] at com.sh1r0.caffe_android_lib.CaffeMobile.predictImage(CaffeMobile.java:35)
09-21 22:57:50.069 10464-11287/com.sh1r0.caffe_android_demo A/art: art/runtime/check_jni.cc:65] at com.sh1r0.caffe_android_demo.MainActivity$CNNTask.doInBackground(MainActivity.java:173)
09-21 22:57:50.069 10464-11287/com.sh1r0.caffe_android_demo A/art: art/runtime/check_jni.cc:65] at com.sh1r0.caffe_android_demo.MainActivity$CNNTask.doInBackground(MainActivity.java:162)
09-21 22:57:50.069 10464-11287/com.sh1r0.caffe_android_demo A/art: art/runtime/check_jni.cc:65] at android.os.AsyncTask$2.call(AsyncTask.java:292)
09-21 22:57:50.069 10464-11287/com.sh1r0.caffe_android_demo A/art: art/runtime/check_jni.cc:65] at java.util.concurrent.FutureTask.run(FutureTask.java:237)
09-21 22:57:50.069 10464-11287/com.sh1r0.caffe_android_demo A/art: art/runtime/check_jni.cc:65] at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231)
09-21 22:57:50.069 10464-11287/com.sh1r0.caffe_android_demo A/art: art/runtime/check_jni.cc:65] at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
09-21 22:57:50.069 10464-11287/com.sh1r0.caffe_android_demo A/art: art/runtime/check_jni.cc:65] at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
09-21 22:57:50.069 10464-11287/com.sh1r0.caffe_android_demo A/art: art/runtime/check_jni.cc:65] at java.lang.Thread.run(Thread.java:818)
09-21 22:57:50.069 10464-11287/com.sh1r0.caffe_android_demo A/art: art/runtime/check_jni.cc:65]
09-21 22:57:50.089 10464-11287/com.sh1r0.caffe_android_demo A/libc: Fatal signal 11 (SIGSEGV), code 1, fault addr 0x1c in tid 11287 (AsyncTask #1)
But when I use the x86_64 lib shipped with caffe-mobile-demo, it works well.
Can you describe how you build the .SO in this demo project?