您的位置:首页 > 其它

解决动态调用其他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,问题解决
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
从而能够加载成功

测试工程下载
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐