这几天在整这个东东,上网查了很多资料。
根据自己的实际情况整理一下,只实现调用C++函数。
需求:调用C++编写的根据传入的随机数组,生成加密后的数组。
1.下载NDK,然后解压,将路径添加到环境变量,重启电脑。
R 7以上版本不需要安装cygwin,省事好多。
不配置环境变量也行,就是运行nkd命令时要指定路径
2.首先要声明在Android调用的C++函数;
public native void MD5CheckPrinter(byte[] MD5Rand,byte[] MD5Return);native是修饰符必须的
System.loadLibrary:加载最后生成的.so文件
3.打开命令管理器,进入调用C++函数文件所在的包的父路径(我的是在项目内的bin文件夹下,但我生成.h文件不成功)
然后调用javah命令:javah [-classpath 要生成的文件所在包的父路径] -jni 完整包名.类名
由于当前目录就是包所以父目录,所以直接-jni参数就可以了。
生成的中间会提示找不到包和类,但是没关系,.h文件生成,有包含函数声明就可以:
JNIEXPORT void JNICALL Java_PRTAndroidSDK_PRTAndroidPrint_MD5CheckPrinter
(JNIEnv *, jobject, jbyteArray, jbyteArray);
为声明加上参数名
JNIEXPORT void JNICALL Java_PRTAndroidSDK_PRTAndroidPrint_MD5CheckPrinter
(JNIEnv *_pEnv, jobject _obj, jbyteArray _jbyteArrRand, jbyteArray _jbyteArrReturn);
4.在项目下面新建jni文件夹,将PRTAndroidSDK_PRTAndroidPrint.h文件复制进去。
5.新建PRTAndroidSDK_PRTAndroidPrint.cpp文件,里面实现C++内容。
文件头包含PRTAndroidSDK_PRTAndroidPrint.h文件,cpp文件里面函数实现必须跟h文件声明一样。
我是在VS里面修改原C++文件的,这样有错误时会提示。由于本人是C++菜鸟,在最开始编译时将被调用函数放在了文件尾,所以提示找不到函数。
里面的很多数据类型都需要转换
6.新建.mk文件:编译成so文件所需的配置文件,下面几行是必须的,最简单的几个设置
网上有关于.mk文件的更详细的说明,有兴趣的可以去找找
7.在项目目录下运行nkd-build命令,会在bin/armeabi目录下生成.mk文件里面设置的文件名,会自动在最面前加lib,使用时不能加这三个字符。
由于我界面和部分功能所以目录分开,所以javah和ndk-build两个命令使用的目录不同。
8.至此,就可以调用C++实现的功能了,可以将软件的关键部分进行包装。
9.再写下其它两个加密方法(转载):
关键数据可放在服务器,使用时从服务器下载下来使用。
部分代码可放在服务器,使用服务器下载下来解密后用eval命令运行。此方法需要定期更新加密算法,同时定期更新APP。