Android studio ndk-build方式开发
温馨提示:这篇文章已超过578天没有更新,请注意相关的内容是否还可用!
一切都要靠自己的运气,他得到的并不是我自己的。本文主要介绍android studio ndk-builld开发相关的知识,希望对您有所帮助。之前都是在Ubuntu下开发的,项目也老了。最近想转用android studio,不太习惯。Android studio提供了两种不同的ndk开发方式,使用cmake自动编译脚本和类似于eclipse上的ndk-build。如果你想在第三方源码库上进行二次开发,或者需要关联多个源码库,使用ndk-build感觉更灵活,或者不用老经验去踩那么多坑。环境搭建请参考android开发者文档,里面有详细的说明#link-gradle 接下来,在android studio中构建一个ndk示例项目。刷新android studio的工程目录即可看到。如果ndk配置发生变化,需要清理项目
【Android studio ndk-build开发】一切都要靠自己的运气,他得到的并不是我自己的。 本文主要介绍android studio ndk-builld开发相关的知识,希望对您有所帮助。
之前都是在Ubuntu下开发的,项目也老了。 自然而然的就顺理成章的使用eclipse来做各种android开发了。 最近想转用android studio,不太习惯。 Android studio提供了两种不同的ndk开发方式,使用cmake自动编译脚本和类似于eclipse上的ndk-build。 两者的区别在于,如果要直接开发新的单个模块,可以考虑使用cmake,而ide有自己的辅助插件,让程序员使用起来更加得心应手。 如果你想在第三方源码库上进行二次开发,或者需要关联多个源码库,使用ndk-build感觉更灵活,或者不用老经验去踩那么多坑。 环境搭建请参考android开发者文档,里面有详细的说明#link-gradle 接下来,在android studio中构建一个ndk示例项目。 1、新建一个通用工程,添加jni文件夹及子目录include存放头文件,src存放源代码
文章图片
2.在java代码中,新建TestJni类来调用native方法,并使用javah命令生成头文件
文章图片
3 创建对应的方法文件并返回主目录

文章图片
? classpath:类搜索路径,这里是指从当前bin目录开始搜索? d:将生成的头文件放到当前jni目录下? 名称+类名.h)注意:-d和-o只能使用其中一个参数。刷新android studio的工程目录即可看到
文章图片
上面的javah命令可以在外部工具中自定义,方便以后使用。 文件->设置->工具->外部工具点击添加
文章图片
这样就可以右键使用需要包含native方法的文件4.cmake方法会根据脚本提供自动生成的Android.mk脚本,但是ndk-build方法需要自己编写编译配置脚本 Android.mkLOCAL_PATH := $(call my -dir)include $(CLEAR_VARS)LOCAL_C_INCLUDES += $(LOCAL_PATH)/include \\ $(LOCAL_PATH)/srcLOCAL_SRC_FILES := src/hello-jni.cLOCAL_MODULE := NativeLibinclude $( BUILD_SHARED_LIBRARY)Android.mk文件必须以LOCAL_PATH变量 开始定义。 LOCAL_PATH := $(call my-dir) Android 构建系统使用 LOCAL_PATH 来定位源文件。 由于将此变量设置为硬编码值是不合适的,因此 Android 构建系统提供了一个名为 my-dir 的宏。 通过将此变量设置为 my-dir 宏函数的返回值,将其放置在当前目录中。 Android 构建系统将 CLEAR_VARS 变量设置为clear_vars.mk 片段的位置。

包含 Makefile 片段可以清除 LOCAL_PATH 以外的 LOCAL_ 变量,例如 LOCAL_SRC_FILES、LOCAL_MODULE 等。 include $(CLEAR_VARS) 这样做是因为 Android 构建系统在一次执行中解析多个构建文件和模块定义,而 LOCAL_ 是全局变量。 为了通过明确冲突来避免冲突,每个本机组件称为模块。 LOCAL_MODULE 变量用于为这些模块提供唯一的名称。 下面的代码将模块的名称设置为 NativeLib。 LOCAL_MODULE := NativeLib 其实LOCAL_MODULE := libNativeLib 的结果也是可以的。 编译完成后,构建系统会自动添加适当的前缀和后缀,生成动态共享文件。 如果之前已经添加过lib,还是一样的,如: libNativeLib.so 。 在路径“项目路径\\unit2\\app\\build\\intermediates\\ndkBuild\\debug\\obj\\local\\architecture type\\”中可以看到。 使用 LOCAL_C_INCLUDES 指定头文件的搜索路径,使用 LOCAL_SRC_FILES 指定源文件列表。 多个文件可以使用多个源文件名,并用空格分隔。
至此,一个原生项目已经简单描述了。 编译和生成实际模块的构建系统还需要包含适当的构建系统片段,具体取决于要生成的模块的类型。 include $(BUILD_SHARED_LIBRARY) 其中 BUILD_SHARED_LIBRARY 是指向生成的共享文件的脚本。 文件生成格式有以下三种 BUILD_STATIC_LIBRARY: 编译为静态库。
BUILD_SHARED_LIBRARY:编译为动态库 BUILD_EXECUTABLE:编译为 Native C 可执行程序。 这里就不展开展开了。 在android studio中编译原生项目,还需要配置module(app)目录下的build.gradle。 以下是需要添加的 android { defaultConfig { ndk{ abiFilters "armeabi","armeabi-v7a","x86" } } externalNativeBuild{ ndkBuild{ path "src/main/jni/Android.mk" } }} apk在不同的硬件平台运行时,需要根据CPU架构调用不同的共享文件。 ndk{ abiFilters "armeabi","armeabi-v7a","x86"} 会生成三个适合不同cpu架构的共享文件,
文章图片
如果不配置,系统默认生成所有支持的机架包。 如果ndk配置发生变化,需要清理项目
文章图片
externalNativeBuild{ ndkBuild{ path "src/main/jni/Android.mk" } }选择cmake或者ndk-build,这里需要写下脚本路径然后运行工程看看效果。







