当前位置:   article > 正文

在命令行下用cmake交叉编译可在android中运行的so包_android studio cmakelists3.10.2下载

android studio cmakelists3.10.2下载

 

工具安装

  1. NDK,(下载地址:http://tools.android-studio.org/
  2. CMake

交叉编译方式

  • 一是用NDK自带的工具链
  • 二是使用独立工具链

方式一步骤

一、按照JNI的实现方式建一个工程

JNI的实现大概有以下几步:

  1. 编写带有 native 方法的 Java 类
  2. 生成该类扩展名为 .h 的头文件
  3. 创建该头文件的 C/C++ 文件,实现 native 方法
  4. 将该 C/C++ 文件编译成动态链接库
  5. 在Java 程序中加载该动态链接库

最后建好的工程目录如下图所示

MyJni类是一个带native方法的java类

Navive.c是实现native方法的本地类 
内容如下: 

  1. #include <jni.h>
  2. #include <android/log.h>
  3. #ifndef _Included_com_jni_MyJni
  4. #define _Included_com_jni_MyJni
  5. #ifdef __cplusplus
  6. extern "C" {
  7. #endif
  8. /*
  9. * Class: com_jni_MyJni
  10. * Method: callNative
  11. * Signature: ()I
  12. */
  13. JNIEXPORT jint JNICALL Java_com_jni_MyJni_callNative
  14. (JNIEnv * env, jobject obj){
  15. __android_log_print(ANDROID_LOG_DEBUG,"Native.c","Hello! I am in native.\n");
  16. int i = 9;
  17. return (jint)i;
  18. }
  19. #ifdef __cplusplus
  20. }
  21. #endif
  22. #endif

仅打印了一句日志。

CMakeLists.txt的内容如下: 

  1. cmake_minimum_required(VERSION 3.4.1)
  2. add_library(myso SHARED Native.c)
  3. set_target_properties(myso
  4. PROPERTIES
  5. LIBRARY_OUTPUT_DIRECTORY
  6. "${CMAKE_CURRENT_SOURCE_DIR}/lib")
  7. include_directories(/usr/lib/jvm/java-8-oracle/include /usr/lib/jvm/java-8-oracle/include/linux)
  8. target_link_libraries(myso
  9. log)

 

添加了一个myso的动态库,输出到c目录下的lib目录中(实际输出的名字叫:libmyso.so)

至此,如果不需要交叉编译的话进入build目录下执行下面两条命令就可以生成so包了(目前build只是个空目录) 

  1. $ cmake ..
  2. $ make

 

不过这个so包只能在当前pc上使用,不能用在手机上(实际上这个例子按上面的方法执行是会报错的,因为用到了android的日志,会找不到头文件的,这里只是说明一下本地编译与交叉编译的区别)。如果要交叉编译就要配置交叉编译环境,这就是今天的重头戏。

二、配置交叉编译环境

写一个脚本来记录这些参数,在build目录下新建configuer.sh文件,内容如下: 

  1. /home/wxyz/Android/Sdk/cmake/3.10.2.4988404/bin/cmake \
  2. -DANDROID_ABI=armeabi-v7a \
  3. -DANDROID_PLATFORM=android-15 \
  4. -DCMAKE_BUILD_TYPE=Debug \
  5. -DANDROID_NDK=/home/wxyz/Android/Sdk/ndk-bundle \
  6. -DCMAKE_TOOLCHAIN_FILE=/home/wxyz/Android/Sdk/ndk-bundle/build/cmake/android.toolchain.cmake \
  7. -DANDROID_TOOLCHAIN=clang ..

这里对各个参数作个解释:

ANDROID_ABI 是cpu架构

ANDROID_PLATFORM是支持的最低android平台

ANDROID_NDK是ndk的根目录

CMAKE_TOOLCHAIN _FILE是工具链文件,这个参数非常重要,这里面还配置了很多其它参数。

ANDROID_TOOLCHAIN是C/C++编译器,可选Clang和gcc,官网推荐clang

最后还有两个点,代表上一级目录,即CMakeLists.txt所在的目录

在build目录下执行这个脚本,再执行make命令,可用于android的so包就出来了。 

方式二步骤

主要包含以下两个步骤:

  • 编译独立工具链
  • 使用独立工具链编译so包

一、编译独立工具链

编译独立工具链是利用$NDK/tools下的 make-standalone-toolchain.sh 脚本来生成独立的交叉编译工具链,先用 –help 参数来看一下具体用法

参数不多,有几个还是不再使用的,主要的只有以下几个:

  • –toolchain=<name> 指定toolchain,在 $NDK/toolchains 目录下可以看到所有支持的编译链工具,根据目标cpu架构进行选择。
  • –arch=<name> 指定目标cpu架构
  • –platform=<name> 指定android平台,默认是[android-14]

好,现在来指定一下这几个参数,

  • –toolchain=arm-linux-androideabi-4.9
  • –arch=arm
  • –platform=android-15

然后运行这个脚本,稍等片刻就能看到如下的结果:
 

二、编译so包

新建一个jni工程,目录如下方式一

CMakeLists.txt中的内容就是重点了,这里面指定了刚刚编译好的独立工具链,内容如下:

  1. cmake_minimum_required(VERSION 3.4.1)
  2. set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -std=gnu99")
  3. # Android 5.0 以上需要在此处设置 PIE
  4. set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fPIE")
  5. set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -fPIE -pie")
  6. # 配置使用 NDK Standalone Toolchain 编译
  7. set(NDK_STANDALONE_TOOLCHAIN /tmp/ndk-hm/arm-linux-androideabi)
  8. set(CMAKE_SYSTEM_NAME Android)
  9. set(CMAKE_SYSTEM_VERSION 21)
  10. set(CMAKE_C_COMPILER ${NDK_STANDALONE_TOOLCHAIN}/bin/clang)
  11. set(CMAKE_CXX_COMPILER ${NDK_STANDALONE_TOOLCHAIN}/bin/clang++)
  12. set(CMAKE_FIND_ROOT_PATH ${NDK_STANDALONE_TOOLCHAIN})
  13. # 使用 NDK 提供的头文件
  14. add_definitions("--sysroot=${NDK_STANDALONE_TOOLCHAIN}/sysroot")
  15. add_library(myso SHARED CTest.c)
  16. set_target_properties(myso
  17. PROPERTIES
  18. LIBRARY_OUTPUT_DIRECTORY
  19. "${CMAKE_CURRENT_SOURCE_DIR}/lib")
  20. include_directories(/home/hm/JDK/jdk1.8.0_151/include /home/hm/JDK/jdk1.8.0_151/include/linux)
  21. target_link_libraries(myso
  22. log)


进入build目录,执行一下:

  1. ~/cmake_sample/cross_for_android/build$ cmake ../c/
  2. ~/cmake_sample/cross_for_android/build$ make

进入c/lib目录看一下结果:

嗯,so包已经出来了,接下来建个工程验证一下,看看这个so包能不能用。
 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Gausst松鼠会/article/detail/202575
推荐阅读
相关标签
  

闽ICP备14008679号