Android loadLibrary - dlopen failed

先前具有系統權限下,使用System.loadLibrary可正常的讀取到system/lib底下的.so檔
但在Android 8 (SDK 26, M) 卻得到以下訊息而Crash

java.lang.UnsatisfiedLinkError: dlopen failed: library “/system/lib/libcutils.so”
is not accessible for the namespace “classloader-namespace”

原因是Anroid 7 (SDK 24, N) 避免載入非公開API時,會使得APP Crash。

網路上解決方式有以下幾種

修改system/etc/public.libraries.txt

將非官方library的名稱libgstreamer.so加入到public.libraries.txt中。

但此方式在我開發的機器上會失敗而無法進入到Android 桌面,
或許是需要燒image的方式才能成功。

指定讀取 vendor lib

可將第三方library放到vendor/lib中,此方法試過是可行的。

device manufactures 機制

在Android 9提供了device manufactures 機制,依然可將library放到system/lib之中,但是必須將library命名為 lib*COMPANYNAME.so 如 libgstreamer.qisda.so

並在system/etc/中增加 public.libraries-COMPANYNAME.txt

由於手上無Android 9 的機器,此方式還未測試過。

Reference

source.android.com

作者

Nick Lin

發表於

2019-03-27

更新於

2023-01-18

許可協議


評論