AndroidStudio编写JNI程序
来源:互联网 发布:js杀破狼为什么不给听 编辑:程序博客网 时间:2024/06/05 23:45
推荐一篇文章:
http://blog.csdn.net/yanbober/article/details/51027520
这会是一个个人调研及尝试的整理。因为公司在用eclipse+cdt编写jni,本人实在用惯了as,所以总结一些as编写jni的方法。
1、NDK-build,老版本gradle
android studio编写NDK也是发展了几个版本,所以网上也会查询到多种多样的历史方式。一开始是用cygwin,然后采用ndk中的工具链ndk build。
android studio默认so位置是jniLibs文件夹中,可以通过gradle设置。进入android.mk所在目录,执行ndk-build后默认会编译在Libs文件夹中,从而导致so库找不到,这个需要注意。
后来,也可以通过gradle设置来自动使用ndk编译:
android { defaultConfig { //设置NDK的模块名称及平台 ndk{ moduleName "hello-jni" abiFilters "armeabi" } } //设置本地代码,[]内容去掉则禁止AS的NDK自动编译。 sourceSets{ main{ jni.srcDirs = ['src/main/jni'] } }}
2、最新版本gradle,link C/C++!
当然,上面的方法,执行ndk build编写gradle都已经过时了!采用最新版本的gradle 2.2.2,不需要再进行上面的步骤!
首先,先看一种新手经常碰到的问题,as中C++代码错误:
代码多出标红,没有自动提示,是不是很抓狂。这个问题,也困扰本人好久,今天居然又去查阅了下as官方文档,发现已经支持C++了啊,但是没有找到具体配置。于是自己各种点点点居然试出来了。
其实就是头文件没有链接上,今天偶然发现解决方法:
本人是给as更新到2.2.2,gradle使用2.14就是最新吧记不清了。点击file,选择Linked C++:
然后选择Jni中的Android.mk文件。
ok,头文件连接上了,也有自动提示了,可以开发了!
程序编写完成,不需要ndk build,直接运行程序,会自动编译打包so文件。
如图代码中不再有jniLibs文件夹
但是编译打包安装apk后,可以在build文件夹下找到编译好的so库。
综上所述,利用as编写JNI程序,可以采用最新版本的gradle,然后link上我们的android.mk,这样ndk build之类的操作都可以省略了,as可以帮我们编译出so文件。
3.在Native方法中Log。
我们无法直接使用printf在android studio的logcat进行日志打印。为了做到这个,需要新建一个头文件:
#include <Android/log.h>#ifndef BRUSHVIEWDEMO_LOG_UTIL_H#define BRUSHVIEWDEMO_LOG_UTIL_H#define LOG "brush_demo_jni"#define LOGE(...) __android_log_print(ANDROID_LOG_ERROR,LOG,__VA_ARGS__)#endif //BRUSHVIEWDEMO_LOG_UTIL_H
在要Log的地方引入这个头文件,调用LOGE方法就可以在Logcat中打出本地方法中的日志。使用方法:
LOGE(“float arr:%d,%d”,(int)res_arr[0],(int)res_arr[1]);
在LOGE中类似printf一样,输出你想打印的内容。
4.常用配置
Android.mk:
LOCAL_PATH := $(call my-dir)include $(CLEAR_VARS)LOCAL_MODULE := 模块名字LOCAL_C_INCLUDES+= $(LOCAL_PATH)SRC_FILES := $(wildcard $(LOCAL_PATH)/*.cpp)SRC_FILES := $(SRC_FILES:$(LOCAL_PATH)/%=%)LOCAL_SRC_FILES := $(SRC_FILES)#LOCAL_LDLIBS := -llog -landroidLOCAL_LDLIBS := -lloginclude $(BUILD_SHARED_LIBRARY)
自动编译jni中全部cpp,比较方便。
Application.mk:
#APP_STL := gnustl_staticAPP_STL := stlport_staticAPP_ABI := armeabi-v7a
使用gradle编译,在app.gradle中:
android { sourceSets { main { //注意下面两行命令顺序不可以颠倒,不然会先加载so库然后又自动编译。 //禁止自动编译 jni.srcDirs = [] //disable automatic ndk-build //指定jniLibs的位置 jniLibs.srcDirs = ['native-libs'] } } }
- AndroidStudio编写JNI程序
- 使用AndroidStudio编写第一个JNI程序
- Android JNI编程(七)——使用AndroidStudio编写第一个JNI程序
- AndroidStudio JNI
- JNI学习一:编写HelloWorld程序
- JNI学习一:编写HelloWorld程序
- 编写JNI程序遇到的问题
- 编写自己的android jni程序
- Android中JNI程序的编写
- 编写第一个jni入门程序
- 编写第一个jni入门程序
- Androidstudio中配置JNI
- AndroidStudio 如何使用JNI
- JNI编程(AndroidStudio)
- AndroidStudio下jni开发
- androidStudio jni 简单入门
- Androidstudio JNI 环境配置
- AndroidStudio使用jni开发
- 2016.11.22 左右法则
- HttpURLConnection的简单使用
- 第12周OJ实践 1*3*5*...*n
- 深入剖析ConcurrentHashMap(1)
- OS 最全动画教程(基础)
- AndroidStudio编写JNI程序
- java异常集
- 不理解的话
- CVPR 2016-11-17
- 【java】Apache POI - the Java API for Microsoft Documents
- 元数据基准测试工具mdtest使用介绍及下载地址
- 彻底理解Java动态代理
- 【面试必读(编程基础)】OpenGL ES 2.0渲染管线
- 整数和数组转化为字符串