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

在一个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
从而能够加载成功


测试工程下载

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值