Android自助餐之Jni(六)NDK入门

版权声明:博主原创文章,转载注明出处! https://blog.csdn.net/xmh19936688/article/details/51703428

Android自助餐之Jni(六)NDK入门

Android自助餐专栏

Android自助餐之Jni(一)最简单的运行

Android自助餐之Jni(二)静态导入so文件

Android自助餐之Jni(三)动态导入so文件

Android自助餐之Jni(四)在线导入so文件

Android自助餐之Jni(五)进阶

Android自助餐之Jni(六)NDK入门

用途

  1. 兼容不同平台
  2. 复用代码库,或向外提供库
  3. 提高运行效率

步骤

  1. 设计app,明确Java与native的分工
  2. 创建Project
  3. 如果用到了NativeActivity,需要在AndroidManiFest.xml声明
  4. 创建Android.mkApplication.mk
  5. jni文件夹编写native代码
  6. 生成.so.a文件
  7. 生成.dex文件
  8. 生成apk文件

Android.mk

文件内容

  1. LOCAL_PATH :=$(call my-dir)指明代码文件根目录,该目录包含本Android.mk文件。Android.mk文件比以此开头
  2. include $(CLEAR_VARS)清除LOCAL_PATH之外的LOCAL_开头的变量。必须在描述module前定义此变量
  3. LOCAL_MODULE := jni-demo声明该jni的module名称,build后该module将生成libjni-demo.so文件。
    如果module的名称本来就以lib开头,则生成的so文件不会再增加lib前缀。此举是为了支持安卓自带的源码,他们都是以lib开头的
  4. LOCAL_SRC_FILES := hello-jni.c列举需要被build的c或c++文件,多个文件用空格隔开。
  5. include $(BUILD_SHARED_LIBRARY)集合所有信息并build到一起。

ndk已定义变量

自定义变量时,需要注意系统保留变量名:以LOCAL_ PRIVATE_ NDK_ APP开头的变量名;小写字母的变量(如my-dir)。推荐使用MY_开头来定义自己的变量。
1. CLEAR_VARS取消定义以LOCAL_开头的变量,需要在描述module前使用,语法:include $(CLEAR_VARS)
1. BUILD_SHARED_LIBRARY决定如何build,需要在指定LOCAL_MODULELOCAL_SRC_FILE之后使用,语法:include $(BUILD_SHARED_LIBRARY)
1. BUILD_STATIC_LIBRARYbuild一个static的library。生成的库不会被copy到project和包中,但是可以被用来build到shared的library。语法:include $(BUILD_STATIC_LIBRARY)
1. PREBUILT_SHARED_LIBRARY用于build一个使用了其他SHARED_LIBRARY的library,这里的LOCAL_SRC_FILES的值不是代码文件,而是已build的库文件(如foo或libfoo.so)。用法:include $(PREBUILT_SHARED_LIBRARY)
1. PREBUILT_STATIC_LIBRARY用于build一个使用了其他STATIC_LIBRARY的library,其他同PREBUILT_SHARED_LIBRARY
1. TARGET_ARCH指明目标CPU架构的名称
1. TARGET_PLATFORM指明目标平台的Android版本,比如用于5.1系统则为TARGET_PLATFORM = android-22
1. TARGET_ARCH_ABI存放目标CPU的架构名。用法:TARGET_ARCH_ABI :=arm64-v8a
|CPU|Setting|
|:—:|:—:|
|ARMv5TE|armeabi|
|ARMv7|armeabi-v7a|
|ARMv8 AArch64|arm64-v8a|
|i686|x86|
|x86-64|x86_64|
|mips32(r1)|mips|
|mpis64(r6)|mips64|
|All|all|
1. TARGET_ABI同时制定android平台和CPU架构,用法TARGET_ABI := android-22-arm64-v8a

module描述变量

  1. LOCAL_PATH
  2. LOCAL_MODULE
  3. LOCAL_MODULE_FILENAME
  4. LOCAL_SRC_FILES
  5. LOCAL_CPP_EXTENSION
  6. LOCAL_CPP_FEATURES
  7. LOCAL_C_INCLUDE
  8. LOCAL_CFLAGS
  9. LOCAL_CPPFLAGS
  10. LOCAL_STATIC_LIBRARIES
  11. LOCAL_SHARED_LIBRARIES
  12. LOCAL_WHOLE_STATIC_LIBRARIES
  13. LOCAL_LDLIBS
  14. LOCAL_LDFLAGS
  15. LOCAL_ALLOW_UNDEFINED_SYMBOLS
  16. LOCAL_ARM_MODE
  17. LOCAL_ARM_NEON
  18. LOCAL_DISABLE_NO_EXECUTE
  19. LOCAL_DISABLE_RELRO
  20. LOCAL__DISABLE_FORMAT_STRING_CHECKS
  21. LOCAL_EXPORT_CFLAGS
  22. LOCAL_EXPORT_CPPFLAGS
  23. LOCAL_EXPORT_C_INCLUDES
  24. LOCAL_EXPORT_LDFLAGS
  25. LOCAL_EXPORT_LDLIBS
  26. LOCAL_SHORT_COMMANDS
  27. LOCAL_THIN_ARCHIVE
  28. LOCAL_FILTER_ASM

NDK提供的方法宏

  1. my-dir
  2. all-subdir-makefiles
  3. this-makefile
  4. parent-makefile
  5. grand-parent-makefile
  6. import-module

Application.mk

其他

  1. 如果两个方法有同样签名,则会报出连接错误link error,C中的签名仅包括方法名,C++中的签名包括方法名及参数。

猜你喜欢

转载自blog.csdn.net/xmh19936688/article/details/51703428