Android调用C++程序

这几天在整这个东东,上网查了很多资料。

根据自己的实际情况整理一下,只实现调用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。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章