解决动态调用其他APK中的类so加载失败问题
2016-08-26 15:51
471 查看
在一个APK中去加载并调用另一个已安装的APK中类,为了方便描述,调用的APK成为主A,被调用的的B,B中的类需要加载so,B独立运行时so能加载成功,但由A加载调用B时会提示so加载失败,进一步分析是在loadLibrary的时候so查找路径为空,而B自己独立运行时查找路径会包括/data/data/B包名/lib,由此为突破口,发现使用PathLoader加载B中的类时可以传入libraryPath路径,于是传入/data/data/B包名/lib,问题解决
2 被调用类
报错如下图:
传入B的lib目录:
测试工程下载
import com.test.app.jar.ITest; import dalvik.system.PathClassLoader; import android.os.Bundle; import android.app.Activity; import android.content.Context; public class MainActivity extends Activity { private Context mContext; private ITest mItest; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mContext = MainActivity.this; Context context; try { context = mContext.createPackageContext("com.test.appb", Context.CONTEXT_IGNORE_SECURITY | Context.CONTEXT_INCLUDE_CODE); String path = context.getApplicationInfo().sourceDir; // error // PathClassLoader loader = new PathClassLoader(path, // mContext.getClassLoader()); // success PathClassLoader loader = new PathClassLoader(path, "/data/data/com.test.appb/lib", mContext.getClassLoader()); Class<ITest> reflect = (Class<ITest>) loader .loadClass("com.test.appb.BeCalledClass"); mItest = (ITest) reflect.newInstance(); if (mItest != null) { mItest.init(mContext); } } catch (Exception e) { e.printStackTrace(); } } }
2 被调用类
package com.test.appb; import android.content.Context; import android.util.Log; import com.test.app.jar.ITest; public class BeCalledClass implements ITest { @Override public void init(Context context) { Log.d("YJS", "ready loadLibrary"); System.loadLibrary("test"); } }
报错如下图:
传入B的lib目录:
PathClassLoader loader = new PathClassLoader(path,"/data/data/com.test.appb/lib", mContext.getClassLoader());ClassLoader的LibraryDirectories中就加入了
/data/data/com.test.appb/lib从而能够加载成功
测试工程下载
相关文章推荐
- java动态加载指定的类或者jar包反射调用其方法-涉及其他jar中的类就报ClassNotFound问题分析及解决思路
- java动态加载指定的类或者jar包反射调用其方法-涉及其他jar中的类就报ClassNotFound问题分析及解决思路
- 解决“ .dll(或.ocx)控件已加载,但对DllregisterServer的调用失败,错误代码为0x80004005”问题的两种终极方法:SubInACL安装 VS 命令提示符
- Launcher中动态加载其它APK中Activity的问题解决思路
- 解决Visual Studio 2005 包加载失败问题。解决SQlserver企业管理器无法启动,SQLDMO未注册问题。
- 动态加载JS文件,完美解决跨域、编码、嵌套、队列、兼容性、执行顺序等相关问题。
- Extjs 树的动态更改加载地址,以及动态加载已有子节点其他节点问题!
- AX中动态产生方法并且调用,解决根据不同条件产生不同SQL逻辑的问题很方便
- 解决Weblogic 配置连接池加载数据库驱动失败问题
- 总结Asp.net中Page加载PostData的具体过程 进而解决"获取动态创建的控件的PostData数据"问题
- vs2005水晶报表WEB打印问题、加载报表失败。-解决办法
- 运用ORACLE的OO4O类库函数解决调用存储过程向远程数据库上传超过32K图片失败的问题
- 解决了动态加载的问题
- 嵌入式Linux2.6 Kernel Module模板动态加载实例和常见问题解决方法
- 小问题: windows组件调用失败,无法加载安装安装程序:Wbemupgd.dll
- vs2005水晶报表WEB打印问题、加载报表失败。-解决办法 (ZT)
- [转]小问题: windows组件调用失败,无法加载安装安装程序:Wbemupgd.dll
- Asp.net 2.0 动态加载其他子目录用户控件问题
- 关于ENU OS加CHS VS2008出现包加载失败问题解决方法存档
- vs2005水晶报表WEB打印问题、加载报表失败。-解决办法