android加载指定路径so库文件
程序员文章站
2022-03-29 20:19:34
public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); initNativeDirectory(getApplic....
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initNativeDirectory(getApplication());
System.load("/data/data/com.example.myapplication/files/libc++_shared.so");
System.load("/data/data/com.example.myapplication/files/libaaa.so");
}
public static void initNativeDirectory(Application application) {
if (hasDexClassLoader()) {
try {
Log.v("TAG", "create new native dir");
createNewNativeDir(application);
} catch (Exception e) {
e.printStackTrace();
}
}
}
private static void createNewNativeDir(Context context) throws Exception{
PathClassLoader pathClassLoader = (PathClassLoader) context.getClassLoader();
Object pathList = getPathList(pathClassLoader);
//获取当前类的属性
Object nativeLibraryDirectories = pathList.getClass().getDeclaredField("nativeLibraryDirectories");
((Field) nativeLibraryDirectories).setAccessible(true);
//获取 DEXPATHList中的属性值
ArrayList pathObjects = (ArrayList)((Field) nativeLibraryDirectories).get(pathList);
Object[] patharr = pathObjects.toArray();
//添加自定义.so路径
String mylibpath = "/data/data/com.example.myapplication/files";//context.getFilesDir().getAbsolutePath();
ArrayList<File> fl = new ArrayList<>();
fl.add(new File(mylibpath));
for (int i = 0; i < patharr.length; i++) {
fl.add(new File(patharr[i].toString()));
}
((Field) nativeLibraryDirectories).set(pathList, fl);
}
private static Object getPathList(Object obj) throws ClassNotFoundException, NoSuchFieldException, IllegalAccessException {
return getField(obj, Class.forName("dalvik.system.BaseDexClassLoader"), "pathList");
}
private static Object getField(Object obj, Class cls, String str) throws NoSuchFieldException, IllegalAccessException {
Field declaredField = cls.getDeclaredField(str);
declaredField.setAccessible(true);
return declaredField.get(obj);
}
/**
* 仅对4.0以上做支持
* @return
*/
private static boolean hasDexClassLoader() {
try {
Class.forName("dalvik.system.BaseDexClassLoader");
return true;
} catch (ClassNotFoundException var1) {
return false;
}
}
}
本文地址:https://blog.csdn.net/weixin_28927079/article/details/107208314
上一篇: 荐 CSS3——3D变形及轮播图,开门,导航栏旋转特效的应用
下一篇: Python类和实例调用
推荐阅读
-
linux软件开发时给gcc指定头文件和库文件路径的方法
-
android studio怎么添加.so文件?android studio加载so文件的方法
-
Android Studio NDK cpp读取so库文件
-
Android 的 so 文件加载机制
-
android加载指定路径so库文件
-
Python 导出指定位置中所有文件的路径至excel表 os库 xlwt库
-
ffmpeg 编译android so库文件
-
【Android】动态链接库so的加载原理
-
Android.bp 文件中引入aar、jar、so库正确编译方法(值得收藏)
-
php实现文件下传到指定文件夹,文件路径或名字存入数据库,怎么实现