解决动态调用其他APK中的类so加载失败问题

来源:互联网 发布:有没有微信埋雷软件 编辑:程序博客网 时间:2024/04/29 04:03
在一个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,问题解决
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
从而能够加载成功


测试工程下载

0 0
原创粉丝点击