上一篇文章讲了如何在windows下使用androidstudio编译openssl库文件给我们使用。
本片文章教大家如何使用编好的openssl库进行调用。
首先大家来了解一下jni开发的两种方式:
1 ndk-build 该方式就是在main包下建立jni文件夹,生成的cpp文件就要放在jni里面,然后定义android.mk和application.mk两个文件,具体的请参考其他文章。变量定义好后,进入terminal 下进入jni文件夹,通过命令ndk-build即可编译。生成出来的so文件要放回本项目,放在jniLibs下面,java文件会自动调用。
2 cmake方式,该方式操作比较简单,现在androidstudio3.0默认的就是这种方式进行编译,只需要加一个cmakelists文件,在gradle里面配置一下即可。最后gradle 进行sync一下就能够直接运行。
本片文章采用第二种方式进行编译。由于我不会c++公司项目也不能外放,所以只用一个例子进行说明。c++里有区别,其他情况都一样的,
好的,现在开始:
首先新建一个项目,勾选下方的include C++ Support,后边的都默认即可。

这是一个生成出来的默认的项目

但是我们不用这个,在firstcpp下新建一个NativeHelper类,如下

上边的名字往后看,在cmakelist文件里进行指定,没事,爆红也不要管他。这个时候rebuild项目

依次去build下找到生成的class文件
进入terminal下,进入debug文件下输入命令javah -jni wangmian.www.firstcpp.NativeHelper
生成好后会在debug下发现

头文件,这时候把头文件相应的拷贝到cpp下即可,同时建立相应的c文件。

有人问c文件怎么写,基本就是这样,参数会有一些变化,多百度,照猫画虎,学习一下基本的写法。
好了,接下来该配置openssl了。把上篇文章中的openssl 下有头文件的整体复制过来放在cpp文件夹下,如图

在main文件夹下建立jniLibs文件夹,把上篇文章生成出来的so文件整体拿过来放在jniLibs下。重点是libssl和libcrypto两个so文件。

接下来配置CMakeLists.txt文件

第一个红框是我们将要生成so文件的名字,之后的调用也要用这个名字,自己定义即可,
第二个红框是我们要进行编译的cpp文件,有几个写几个,h文件不用写
接下来指定一下库文件位置:include_directories(src/main/cpp)
接下来定义两个库

cmake文件至此完成。在app的build.gradle文件夹下边 defaultConfig结点里添加:
externalNativeBuild {
cmake {
cppFlags "-std=c++14 -frtti -fexceptions -ffunction-sections -fdata-sections -Ofast"
abiFilters 'x86','x86_64','armeabi','armeabi-v7a',
'arm64-v8a','mips','mips64'
}
}
到这里就大功告成了。你可以尽情的往cpp里添加代码

运行之后的so文件在这个地方,会自动打入apk内部,如果你是要给别人进行调用的话。还需要另外加入,其实都一样的,放入到jniLibs下或者libs下,进行调用。不过调用的时候要注意,java的文件的包名。层级都是要和cpp里的文件名,方法对应的,
所以你可以自己建一个library用同样的包名,或者直接在自己的app里建一个相同的包名。即可。
好的,最后地址奉上:欢迎收看
网友评论