当前位置:首页 > 嵌入式培训 > 嵌入式学习 > 讲师博文 > AS(Android Studio)中使用NDK

AS(Android Studio)中使用NDK 时间:2018-09-25      来源:未知

在AS中要想使用NDK,方法很简单,只要在工程gradle.properties中添加:

android.useDeprecatedNdk=true

在对应的module的build.gradle文件中的defaultConfig下添加:

ndk{

moduleName "库名"

}

这两段代码指令就可以和在Eclipse中一样使用NDK了。

但是这里和Eclipse中不同的地方是,每次Build之后,可能需要去将生成的动态库文件移动到和app\文件夹下的libs目录中,这个是AS默认的库文件访问地址。

这里还有一个问题,就是当我们在Android.mk文件中-llog或者-lm的时候会出现无法找到对应库的问题。

这个问题的解决方法,其实就是放弃gradle为我们自动编译,那么会不会很复杂呢,其实也不会,因为现在新版的ndk已经很智能了。

同样在build.gradle文件中的Android下添加:

sourceSets.main {

jni.srcDirs = []

jniLibs.srcDir 'src/main/libs'

}

这样我们就将src/main/libs这个目录设置成了工程默认的jni库的存放目录了。

接下来,我们首先来明确一下我们的库名,这个名字是可以任意起的,比如我们叫它“MyNdk”。那么我们生成的库文件的名字就是“libMyNdk.so”。

根据上面的说明,我们修改gradle.properties和build.gradle。

第二步,新建一个工程,这里推荐是为native方法专门建立一个工程,声明的时候可以直接将native方法都声明成static的即可。比如这里新建了一个NdkMethod.java文件,代码如下:

public class NdkMethod {

public static native int add(int a, int b);

}

接下来,通过这个.java文件生成我们.c文件需要使用的.h文件。具体的方法是,在main文件夹下新建一个叫jni的目录,然后在AS的控制台中将目录切换到main下,输入以下命令:

javah -d jni -cp java\ com.farsight.ji.myndk.NdkMethod

其中-d代表将文件放在什么位置,和-o重命名不能同时使用,-cp就是-classpath是我们java工程的目录,后边跟的就是我们的java类。

生成了.h文件之后,就需要去写一个Android.mk了。

很多人可能对.mk文件不是很熟悉,没关系,jni使用的时候.mk使用简单的就可以了,这里在jni目录下,写Android.mk,如下:

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

LOCAL_LDLIBS := -lm -llog

LOCAL_MODULE := myndk

LOCAL_SRC_FILES := myndk.c

include $(BUILD_SHARED_LIBRARY)

其中LOCAL_PATH就是告诉编译器我们要编译哪里的东西,第二条忽略,LOCAL_LDLIBS通过字面我们也知道是链接库,-lm是math库,-llog是,LOCAL_MODULE是我们的库名,要保持一致,LOCAL_SRC_FILES,后边就是跟我们要编译的所有.c文件,后一句(BUILD_SHARED_LIBRARY)就是指生成动态共享库,其实还可以生成可执行文件,这里大家自己摸索吧,更简单。

好了,下边就是.c文件了,myndk.c文件如下:

#define LOGTAG "NDKTEST"

#include

#include "jni.h"

#include "stdio.h"

#include

#include "string.h"

#define LOGI(...) __android_log_print(ANDROID_LOG_INFO, LOGTAG, __VA_ARGS__)

#define LOGD(...) __android_log_print(ANDROID_LOG_DEBUG, LOGTAG, __VA_ARGS__)

#define LOGE(...) __android_log_print(ANDROID_LOG_ERROR, LOGTAG, __VA_ARGS__)

JNIEXPORT jint JNICALL Java_com_farsight_ji_myndk_NdkMethod_add

(JNIEnv *env, jclass thiz, jint frist, jint second){

return frist + second;

}

可以自由发挥,后,编译生成.so库吧,同样在AS的控制台,进入jni目录:

ndk-build

然后cd .. 就可以看到一个libs目录了,在该目录下,就可以找到armeabi或者其他的文件夹,下边就有我们的.so库了。

当然,我们做了这么多工作就是想让JAVA代码来调用C/C++代码,很简单,在我们想要调用的.java文件中声明加载动态库:

static {

System.loadLibrary("myndk");

}

然后就可以使用了:

Log.d("MYNDKTEST", "" + NdkMethod.add(1, 2));

AS中做NDK开发还是比较简单的。

上一篇:Android多线程编程

下一篇:DS18B20时序分析

热点文章推荐
华清学员就业榜单
高薪学员经验分享
热点新闻推荐
前台专线:010-82525158 企业培训洽谈专线:010-82525379 院校合作洽谈专线:010-82525379 Copyright © 2004-2022 北京华清远见科技集团有限公司 版权所有 ,京ICP备16055225号-5京公海网安备11010802025203号

回到顶部