jacky1234 / JniDemos

c.c++开发in Android,cmake,ndk

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

关于Android调用C和C++笔记

Link

下载 NDK 和构建工具

  1. The Android Native Development Kit (NDK): 让你能在 Android 上面使用 C 和 C++ 代码的工具集。
  2. CMake: 外部构建工具。如果你准备只使用 ndk-build 的话,可以不使用它。
  3. LLDB: Android Studio 上面调试本地代码的工具。

三种方式

a. 手动MK方式

例子位于module:mk-type:

这种编译其实是用make工具来玩的,在 linux 徒手写并编译过c的应该很清楚,通过编写makefile,然后再用make编译已经比不停的用gcc命令逐个编译要爽很多,但是 makefile 的编写还是有点蛋疼。程序员都是化繁为简善解人意的,通过 ndk 工具我们无需自己写 makefile 了,现在你只要安心撸自己关心的代码就行了。

编译中出现了错误: NDK_PROJECT_PATH=null ,查询资料说 NDK一定要r9+版本的。实际我用r10e版本也是可行的,可能高版本是无法通过的。 但是尴尬的是 CMake 提示需要 Please use NDK r12+.

NDK_PROJECT_PATH=null,错误解决此问题的方法是,一点点加入Android.mk的配置,查处问题出现的原因。

b. 配置gradle来编译

这种方式比上一中又简化了很多,无需再自己编写 Android.mk 了,但原理都是一样的

c. CMake方式 (推荐方式)

例子位于module:cmake-type:

  • 调用jni,通过反射调用java代码。

常见的问题

1. 遇到的坑

测试手机为华为mate8,cpu abi类型为 arm64-v8a,armeabi-v7a a种方式,为何在 Appliaciton.mk 非要 APP_ABI 加上arm64-v8a,才能跑起应用(否则报 unsatisfied link error),但是其他方式都不需要,好奇怪。

2. extern "C"的作用

为何要使用extern"C", 原因很简单,在 C++ 中函数在编译的时候会拼接上参数,这也是 c++ 中函数重载的处理机制,比如一个 set(int a) 和一个 set(int a,int b) ,在编译的时候就变成了 set_int 与 set_int_int ,我们加上extern ”C“ 就表示大爷想按照C来编译,所以函数名字后面就不会拼接上参数类型了。

3. the file is not the part of project see the mk-type module's LOCAL_SRC_FILES define

About

c.c++开发in Android,cmake,ndk


Languages

Language:Java 50.1%Language:C++ 20.6%Language:Makefile 18.6%Language:CMake 7.9%Language:C 2.8%