Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Android 6.0 上与 JNA 兼容性问题 #31

Closed
shawnbc opened this issue Jan 18, 2022 · 6 comments
Closed

Android 6.0 上与 JNA 兼容性问题 #31

shawnbc opened this issue Jan 18, 2022 · 6 comments
Labels
bug Something isn't working

Comments

@shawnbc
Copy link

shawnbc commented Jan 18, 2022

你好,在 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@framework@boot.oat (???)

我单独在jni测试调用 TestJna.INSTANCE.test_jna() 是可以的。

@maoabc
Copy link
Owner

maoabc commented Jan 18, 2022

去掉TestJna.INSTANCE.test_jna(str);就正常了是吧?
我后面加个测试看看

@shawnbc
Copy link
Author

shawnbc commented Jan 19, 2022

是的
test_jna 的参数去掉也是正常的。

@maoabc maoabc added the bug Something isn't working label Jan 31, 2022
@maoabc
Copy link
Owner

maoabc commented Jan 31, 2022

加了一个jna相关测试, 已经复现这个问题. 具体原因还要分析

@maoabc
Copy link
Owner

maoabc commented Jan 31, 2022

问题在android6的art或者jna实现的bug, 感觉art有问题的概率更大, 具体原因还是没找到. 目前解决方法, 只能绕过这类代码不对它们native化.

@maoabc
Copy link
Owner

maoabc commented Feb 2, 2022

加了是否有调用jna方法的分析, 有的话则不能进行native化.

@winte1
Copy link

winte1 commented Dec 1, 2022

安卓7.0以下的不太兼容,试用过安卓5运行出错,但用vm保护又正常

@shawnbc shawnbc closed this as completed Jan 16, 2023
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
bug Something isn't working
Projects
None yet
Development

No branches or pull requests

3 participants