在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开发还是比较简单的。