android studio配置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']
        }
    }
}

当然,上面的方法,执行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 -landroid
LOCAL_LDLIBS    := -llog

include $(BUILD_SHARED_LIBRARY)

自动编译jni中全部cpp,比较方便。

Application.mk:

#APP_STL := gnustl_static
APP_STL := stlport_static
APP_ABI := armeabi-v7a

使用gradle编译,在app.gradle中:

 android {
    sourceSets {
        main {
        //注意下面两行命令顺序不可以颠倒,不然会先加载so库然后又自动编译。
         //禁止自动编译
            jni.srcDirs = [] //disable automatic ndk-build
        //指定jniLibs的位置
            jniLibs.srcDirs = ['native-libs']

        }
    }
 }
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值