nmmp
nmmp copied to clipboard
Android 6.0 上与 JNA 兼容性问题
你好,在 Android 6.0 的机器上,加固JNA调用方式的代码会出现崩溃(加固下面这段代码)
public class MyApplication extends Application {
@Override
public void onCreate() {
super.onCreate();
Log.e("MyApplication", "test.");
String str = "jna test";
TestJna.INSTANCE.test_jna(str);
Log.e("MyApplication", "test end.");
}
}
TestJna的代码:
import com.sun.jna.Library;
import com.sun.jna.Native;
public interface TestJna extends Library {
TestJna INSTANCE = Native.load("native-test-jna", TestJna.class);
void test_jna(String msg);
}
native-test-jna 中的代码:
void test_jna(jstring msg) {
LOGE("method = %s", __FUNCTION__);
}
模拟器中的错误日志:
2022-01-18 19:04:20.476 4644-4644/com.example.jnatestapplication E/MyApplication: test.
2022-01-18 19:04:20.483 4644-4644/com.example.jnatestapplication E/art: JNI ERROR (app bug): accessed stale weak global reference 0x745f545b (index 54550 in a table of size 31)
2022-01-18 19:04:20.488 4644-4644/com.example.jnatestapplication A/art: art/runtime/java_vm_ext.cc:410] JNI DETECTED ERROR IN APPLICATION: use of deleted weak global reference 0x745f545b
2022-01-18 19:04:20.488 4644-4644/com.example.jnatestapplication A/art: art/runtime/java_vm_ext.cc:410] from void com.example.jnatestapplication.MyApplication.onCreate()
2022-01-18 19:04:20.488 4644-4644/com.example.jnatestapplication A/art: art/runtime/java_vm_ext.cc:410] "main" prio=5 tid=1 Runnable
2022-01-18 19:04:20.488 4644-4644/com.example.jnatestapplication A/art: art/runtime/java_vm_ext.cc:410] | group="main" sCount=0 dsCount=0 obj=0x75a82710 self=0x7fdcce5fba00
2022-01-18 19:04:20.488 4644-4644/com.example.jnatestapplication A/art: art/runtime/java_vm_ext.cc:410] | sysTid=4644 nice=0 cgrp=default sched=0/0 handle=0x7fdcd1f7d200
2022-01-18 19:04:20.488 4644-4644/com.example.jnatestapplication A/art: art/runtime/java_vm_ext.cc:410] | state=R schedstat=( 0 0 0 ) utm=1 stm=2 core=0 HZ=100
2022-01-18 19:04:20.488 4644-4644/com.example.jnatestapplication A/art: art/runtime/java_vm_ext.cc:410] | stack=0x7fffaac24000-0x7fffaac26000 stackSize=8MB
2022-01-18 19:04:20.488 4644-4644/com.example.jnatestapplication A/art: art/runtime/java_vm_ext.cc:410] | held mutexes= "mutator lock"(shared held)
2022-01-18 19:04:20.488 4644-4644/com.example.jnatestapplication A/art: art/runtime/java_vm_ext.cc:410] native: #00 pc 00000000005678e7 /system/lib64/libart.so (art::DumpNativeStack(std::__1::basic_ostream<char, std::__1::char_traits<char> >&, int, char const*, art::ArtMethod*, void*)+215)
2022-01-18 19:04:20.488 4644-4644/com.example.jnatestapplication A/art: art/runtime/java_vm_ext.cc:410] native: #01 pc 0000000000530b30 /system/lib64/libart.so (art::Thread::Dump(std::__1::basic_ostream<char, std::__1::char_traits<char> >&) const+208)
2022-01-18 19:04:20.488 4644-4644/com.example.jnatestapplication A/art: art/runtime/java_vm_ext.cc:410] native: #02 pc 000000000039cde9 /system/lib64/libart.so (art::JavaVMExt::JniAbort(char const*, char const*)+1177)
2022-01-18 19:04:20.488 4644-4644/com.example.jnatestapplication A/art: art/runtime/java_vm_ext.cc:410] native: #03 pc 000000000039e5c3 /system/lib64/libart.so (art::JavaVMExt::JniAbortF(char const*, char const*, ...)+227)
2022-01-18 19:04:20.488 4644-4644/com.example.jnatestapplication A/art: art/runtime/java_vm_ext.cc:410] native: #04 pc 0000000000529078 /system/lib64/libart.so (art::Thread::DecodeJObject(_jobject*) const+312)
2022-01-18 19:04:20.488 4644-4644/com.example.jnatestapplication A/art: art/runtime/java_vm_ext.cc:410] native: #05 pc 00000000004f64e2 /system/lib64/libart.so (art::InvokeVirtualOrInterfaceWithJValues(art::ScopedObjectAccessAlreadyRunnable const&, _jobject*, _jmethodID*, jvalue*)+754)
2022-01-18 19:04:20.488 4644-4644/com.example.jnatestapplication A/art: art/runtime/java_vm_ext.cc:410] native: #06 pc 00000000003cb51f /system/lib64/libart.so (art::JNI::CallVoidMethodA(_JNIEnv*, _jobject*, _jmethodID*, jvalue*)+511)
2022-01-18 19:04:20.488 4644-4644/com.example.jnatestapplication A/art: art/runtime/java_vm_ext.cc:410] native: #07 pc 00000000001aaa6b /system/lib64/libart.so (art::CheckJNI::CallMethodA(char const*, _JNIEnv*, _jobject*, _jclass*, _jmethodID*, jvalue*, art::Primitive::Type, art::InvokeType)+1755)
2022-01-18 19:04:20.488 4644-4644/com.example.jnatestapplication A/art: art/runtime/java_vm_ext.cc:410] native: #08 pc 00000000001ab551 /system/lib64/libart.so (art::CheckJNI::CallVoidMethodA(_JNIEnv*, _jobject*, _jmethodID*, jvalue*)+33)
2022-01-18 19:04:20.488 4644-4644/com.example.jnatestapplication A/art: art/runtime/java_vm_ext.cc:410] native: #09 pc 0000000000021dda /data/app/com.example.jnatestapplication-1/lib/x86_64/libnmmvm.so (vmInterpret+34442)
2022-01-18 19:04:20.488 4644-4644/com.example.jnatestapplication A/art: art/runtime/java_vm_ext.cc:410] native: #10 pc 000000000000136e /data/app/com.example.jnatestapplication-1/lib/x86_64/libnmmp.so (???)
2022-01-18 19:04:20.488 4644-4644/com.example.jnatestapplication A/art: art/runtime/java_vm_ext.cc:410] native: #11 pc 0000000000b7e589 /data/app/com.example.jnatestapplication-1/oat/x86_64/base.odex (void com.example.jnatestapplication.MyApplication.onCreate()+157)
2022-01-18 19:04:20.488 4644-4644/com.example.jnatestapplication A/art: art/runtime/java_vm_ext.cc:410] native: #12 pc 0000000000b78aa5 /data/dalvik-cache/x86_64/system@[email protected] (???)
我单独在jni测试调用 TestJna.INSTANCE.test_jna() 是可以的。
去掉TestJna.INSTANCE.test_jna(str);就正常了是吧? 我后面加个测试看看
是的 test_jna 的参数去掉也是正常的。
加了一个jna相关测试, 已经复现这个问题. 具体原因还要分析
问题在android6的art或者jna实现的bug, 感觉art有问题的概率更大, 具体原因还是没找到. 目前解决方法, 只能绕过这类代码不对它们native化.
加了是否有调用jna方法的分析, 有的话则不能进行native化.
安卓7.0以下的不太兼容,试用过安卓5运行出错,但用vm保护又正常