今天是在国泰实习的第二天,师傅给我安排了小任务-账号本地加密以及自定义键盘,其中加密算法要用C/C++实现。
当然我第一反应就是先做个NDK的demo,好多博客都是低版本AS中使用NDK的案例,试了下没一个成功的,可能是我AS版本太高的原因吧,编译过程个种报错,头大!!!
大体归结为, CMAKE,文件路径,库加载不到 等问题;
在不懈的搜索下发现了一篇不错的文章:
https://blog.csdn.net/l_scag/article/details/80297212
这个方法不需要去修改gradle.properties和build.gradle
但是需要下载插件CMAKE,当然了CMAKE的安装也很方便,只需要Settings->Appearance&Behavior->System Settings->Android SDK中的SDK Tools中勾选Cmake 然后apply 等待安装完成即可。
然后新建项目, 在新建项目的时候 勾选 support C++
进入项目后会发现工程中以后具有了一个 NDK 的Demo
其中需要了解的有两个:
CMakeList.txt文件和main下的CPP文件夹
在CPP文件夹下存放的是我们具体实现
其中函数名的命名的格式 应该是 Java_包名_类名_方法名
其他遵循JNI协议规范
CMAKE文件主要是和so有关的,包过编译和连接
add_library( # Sets the name of the library. mynativelib # Sets the library as a shared library. SHARED # Provides a relative path to your source file(s). src/main/cpp/native-lib.cpp src/main/cpp/mynativelib.cpp)
其中mynativelib 即为要生成的so文件的名次 可以自己定义,在加载库时也是使用此名字
target_link_libraries( # Specifies the target library. mynativelib # Links the target library to the log library # included in the NDK. ${log-lib} )
这个是用来链接库文件的,为了打包而设计的?我猜的。。。
指定库名,当然这个库名得和上面的库名相同。
在这之前需要在java中实现一个类 类里包含一个native方法。 其实就是对一个方法的声明。
先写这么多以后在补充
昨天师傅说他看了我的blog ,瞬间羞愧,blog写的那么烂!。。。算了就这么烂下去吧
补充1:
一般在写c++时我们会在.h中声明一些变量和方法等,然后在cpp中引入该头文件,在上面的基础上发现,变易出错根本得不到.so文件;想了好久怀疑可能.h文件也需要手动添加到cmake文件中。
于是乎我把我自己创建的.h文件也添加在了cmake文件中如下:
add_library( # Sets the name of the library. mynativelib # Sets the library as a shared library. SHARED # Provides a relative path to your source file(s). src/main/cpp/native-lib.cpp src/main/cpp/mynativelib.cpp src/main/cpp/mynativelib.h)然后编译了一下 哈哈哈通过了。。。这样基本上就可以和c++保持一致的风格了,但是在百度的时候发现一个问题就是有 c++d的容器库貌似用不了,我还没测试!!!