专栏名称: 鸿洋
你好,欢迎关注鸿洋的公众号,每天为您推送高质量文章,让你每天都能涨知识。点击历史消息,查看所有已推送的文章,喜欢可以置顶本公众号。此外,本公众号支持投稿,如果你有原创的文章,希望通过本公众号发布,欢迎投稿。
目录
相关文章推荐
复利大王  ·  化妆太浓,刷脸失败 ·  3 小时前  
复利大王  ·  杭州的牛马要讨个说法 ·  3 小时前  
复利大王  ·  深圳婚恋江湖的厮杀 ·  昨天  
复利大王  ·  分手撕大逼!老马已不适合美国了 ·  昨天  
复利大王  ·  张艺谋最好的电影解禁了 ·  2 天前  
51好读  ›  专栏  ›  鸿洋

Android下玩JNI的新老三种姿势

鸿洋  · 公众号  · android  · 2017-05-26 07:28

正文

请到「今天看啥」查看全文



LOCAL_PATH :是得最先配置的,它用于在开发tree中查找源文件。

include $(CLEAR_VARS) : CLEAR_VARS 变量指向特殊 GNU Makefile ,可为您清除许多 LOCAL_XXX 变量,例如:

LOCAL_MODULE 、 LOCAL_SRC_FILES 和 LOCAL_STATIC_LIBRARIES 。 请注意,它不会清除 LOCAL_PATH.。

LOCAL_PATH :此变量必须保留其值,因为系统在单一 GNU Make 执行环境(其中所有变量都是全局的)中解析所有构建控制文件。 在描述每个模块之前,必须声明(重新声明)此变量。

LOCAL_MODULE :存储您要构建的模块的名称,并指定想生成的 so 叫什么名字。当然生成产物的时候前面会自动拼接上 lib,后面会自动拼接上 .so 。

LOCAL_SRC_FILES :要编译的源文件,多个文件以空格分开即可。当导入 .a 或者 .so 文件的时候一个模块只能添加一个文件,后面将演示。

LOCAL_C_INCLUDES :可以使用此可选变量指定相对于 NDK root 目录的路径列表,以便在编译所有源文件(C、C++ 和 Assembly)时添加到 include 搜索路径,通常是原文件地址、头文件地址等。
LOCAL_LDLIBS :这里是添加一个本地依赖库,比如可以添加一个 log 库,当然我没用到就注释了。

include $(BUILD_SHARED_LIBRARY) :这一行帮助系统将所有内容连接到一起, BUILD_SHARED_LIBRARY 变量指向GNU Makefile 脚本,用于收集您自最近 include 后在 LOCAL_XXX 变量中定义的所有信息。 此脚本确定要构建的内容及其操作方法。 BUILD_SHARED_LIBRARY 代表动态库, BUILD_STATIC_LIBRARY 代表静态库 。

7、编写 Application.mk :


# 指定生成哪些cpu架构的库
APP_ABI := armeabi-v7a
# 此变量包含目标 Android 平台的名称
APP_PLATFORM := android-22


8、在 jni 目录下面打开命令行工具,然后执行 ndk-build ,即可在 libs 目录下得到产物:




9、把产物放到 jniLibs 下面(当然你可以在采用 builde.gradle 的 sourceSets 里面改变其路径, jniLibs.srcDirs=['src/main/libs']) 。



10、 Java 层调用:



结果是:



添加一预构建库编译:

其实和咋们Android中的添加依赖差不多,我们要编译一个原生库,这个库的功能是可以按照 H264 编码视频,然后我们不想自己写那么多代码,所以我们引入开源的 libx264 ,我们拿到编译好的 libx264.a 或者 libx264.so 和其头文件,这个时候我们只需要导入一起编译即可: 目录结构如图



有了头文件我们即可include入我们的 hi_jni.cpp 里面自由蹂蹑。

接下来修改下 Android.mk 。



如果我们导入 .a 的静态库的话第一组就如上所写,每添加一组的时候必须执行 include $(CLEAR_VARS) ,LOCAL_MODULE 的值就各自喜好了,第一组的 LOCAL_SRC_FILES 我们指向想导入的静态库地址,第一组的LOCAL_C_INCLUDES 指向其头文件地址,然后 include $(PREBUILT_STATIC_LIBRARY) 代表生成静态预构建。


我们在第二组中引用第一组的静态预构建也就是 LOCAL_STATIC_LIBRARIES := x264 ,引用动态预构建只需把 STATIC 修改为SHARED 即可。


配置完成即可在当前目录打开命令行执行 ndk-build 命令生成产物。如果第一组你指定的是 .so 的动态库,使用的时候也得在 java 层 System.loadLibrary("x264") 。


2

通过配置AS中build.gradle来编译








请到「今天看啥」查看全文