本文是之前记录在本地的,写的不够详细,旨在记录当时实现的时候遇到的一些问题。
环境需求:一个可以开发NDK的环境、反编译与回编的工具
1、 新建一个NDK工程(基本方法步骤网上说的基本都可以),在native方法中实现一个获取随机数的方法供测试,此工程生成的apk将在后面被另一个apk调用。
遇到的问题: 在工程目录下执行: javah-classpath bin -d jni com.feitian.random.Random
的时候出现:classfile for android.app.Activity not found 错误提示
解决方法参考下面的命令:
Javah –classpath E:\android\workspace\Random\bin\classes(当前工程的classes目录,确保工程编译后有此工程名.class文件生成)-bootclasspath(用来指定android.jar包在哪里) E:\adt-bundle-windows-x86-20140702\sdk\platforms\android-19\android.jar–d jni com.feitian.random.Random
输入之后没有报错表示已经成功,但此时可能在jni文件夹里看不到.h文件,因为此时是在dos下操作的,可以通过dos的查看命令dir查看到jni目录下有相关的.h文件。再通过type命令可以查看相关的内容。
2、实现动态加载:http://www.cnblogs.com/over140/archive/2012/03/29/2423116.html
先调试了这里两个简单例子的源码,确定一下是可以实现的及了解一些方法
实例如图
调用过程就是:RndTest获取ApkLoader实例instance,通过instance动态加载TestImpl的getTest方法,调用getTest获取TestImpl的实例tl,通过tl调动Random.apk包含的native方法
动态加载注意事项如注释
String path = Environment.getExternalStorageDirectory() + "/";
Filefile = context.getDir("dex", 0);
Stringpatha = file.getAbsolutePath();
Stringfilename = "Random.apk";
//初始化类加载器
DexClassLoaderclassLoader = newDexClassLoader(path + filename, patha,
null, context.getClassLoader()); //.dex