安卓NDK开发流程(适合新手学习)

为什么需要用到DNK(也就是jni)?因为安卓有很多功能是实现不了的,尤其是和底层硬件交互的一些操作,比如打印操作,直接用安卓连接底层打印机,就很难实现,但是用C就可以和硬件交互,这个时候就需要用安卓去调用C语音的方法,然后C再和底层硬件交互

OK,言归正传,看一下NDK的简单开发流程(确保自己可以把NDK操作完整地跑一边,就基本上可以明白DNK的作用了)

第一步:下载ndk以及配置ndk路径(在as里面直接下载就ok了,一杯茶的功夫)

如果sdk下面没有ndk-bundle,这边会显示下载,下载好就可以了

第二步:配置环境变量,把ndk-bundle的路径配置到环境变量path里面,因为后面需要在控制台执行ndk-build命令

 

第三步:编写一个包含native方法的类,(这个native方法后面就会用C或者C++去实现)

然后通过javah指令来生成.h头文件,

切记:第一步需要先把NdkTest这个类编译一下,生成字节码,不然会提示找不到class文件

直接在控制台一直cd到这个类所在的文件夹,然后javac NdkTest.java,成功会出现一个class文件

然后在控制台输入javah指令,先通过cd..回退到项目的main目录下,然后敲指令如下:

指令打完之后目录如下,main下面多出来一个jni目录,里面有一个后缀为.h的文件(C、C++的头文件)

大概解释下意思,javah -d jni 表示在main下面创建一个jni文件来存放后面生成的.h文件

-classpath ./Java com.chenxin.testndk.MyJni表示对哪个类进行匹配生成头文件(就是刚刚里面定义了native方法的类)

(小贴士,C语言中的,.h文件和.c文件是不一样的,.h头文件直接指令生成,但是.c文件需要自己新建,在里面实现具体的逻辑,方便好记,我个人为了方便理解(本人也是C小白,勿喷QAQ),大概理解为 .h是java中的接口,只定义框架,不定义内容,.c是.h具体的实现,所以先生成.h,在创建.c文件)

ok,现在头文件有了,再手动创建C文件,来具体实现功能

为了看起来方便,可以把c文件的名字和.h文件最后面的名字定义成一样

接下来就是编写.c文件内容了,如果会C语言,可以自己写,不会的可以网站copy代码(只是为了测试流程)

我copy了一段贴到c文件里:内容如下(发了文字,方便大家直接复制粘贴)

#include <com_chenxin_testndk_MyJni.h>
#include <android/log.h>

#define LOG_TAG "infoo"
#define LOGI(...) __android_log_print(ANDROID_LOG_INFO, LOG_TAG, __VA_ARGS__)

JNIEXPORT jstring JNICALL Java_com_chenxin_testndk_MyJni_getName
  (JNIEnv *env, jclass jz){

        LOGI("hello,这里是native层");
        return (*env)->NewStringUTF(env,"hello jni , you are so easy!");

  }

,OK离成功越来越近,下面需要把两个配置文件copy到jni目录下面,Android.mk和Application.mk

最好是找其他项目的mk文件直接copy过来,手动生成可以会报错

Android.mk(有特殊标记的是需要修改的,其他的参数不用动)

LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)

LOCAL_MODULE := MyJni
LOCAL_SRC_FILES := MyJni.c
LOCAL_LDLIBS +=-L$(SYSROOT)/usr/lib -lm -llog
include $(BUILD_SHARED_LIBRARY)

 

Application.mk

//APP_STL := gnustl_static
APP_ABI := armeabi-v7a
APP_PLATFORM := android-10
//APP_OPTIM := debug
//NDK_DEBUG = 1

最后一步:把C文件转换成.so文件供安卓调用,在控制执行指令ndk-build即可(在mian 目录下)

如果没有报错,那就成功了,成功之后会在main下面再生产两个文件夹,一个是libs,一个是obj,我们要的so文件就在libs目录下面

有了so文件之后,相比大家都很熟悉怎么使用了吧,但是后续还有几个坑,需要提出来,否则到了最后还是会各种报错

1:现在app下面的build.gradle里面加一个配置(必须加,不加就凉凉)

还有一个地方需要注意,很多新手搞不清

 

这边的配置有三种情况,如果把so文件重新放在jniLibs(自己创建的文件夹,安卓搜索so库默认的搜索路径),则不需要这个配置。如果把so放在src平级的Libs里面,则加配置jniLibs.srcDirs=['libs']。第三种,jniLibs.srcDirs=['src/main/libs']适用于把so文件放在main下面的libs里面,加载的路径不一样,配置也不一样

最后,就可以直接调用了,非常愉快!

运行即可

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值