高版本AS NDK 的 Demo

今天是在国泰实习的第二天,师傅给我安排了小任务-账号本地加密以及自定义键盘,其中加密算法要用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的容器库貌似用不了,我还没测试!!!



猜你喜欢

转载自blog.csdn.net/u012232736/article/details/80984675
ndk