原生开发工具包(NDK)是在Android应用中调用C或C++代码的工具。在普通app中实用性不高,但是作为Android开发者也应该有一些了解。下面给大家提供一个小例子借大家学习。
先安装ndk,打开Tools->Android->SDK Manager->SDK Tools选中LLDB和NDK,点击确认,软件会自动安装NDK。
新建工程FirstNdkDemo,配置Module下的build.gradle文件,在defaultConfig中加入:
ndk {
moduleName "demo" //生成的so名字
abiFilters "armeabi", "armeabi-v7a", "x86" //输出指定三种abi体系结构下的so库。
}
sourceSets.main{
jni.srcDirs = []
jniLibs.srcDir "src/main/libs"
}
如下图:
新建java类JniTest.java,里面写原生方法:
JniTest代码:
public class JniTest {
static {
System.loadLibrary("demo");
}
public native String getName();
}
先静态加载library,”demo”就是我们build.gradle中命名的.so库的名字
这里注意关键字native。这里只是声明,实现是通过C或C++来实现。
接下来是生成.h文件,如果没有在Android Studio中配置ndk命令的话,可以看我另一篇博客
Android Studio NDK开发命令配置
当然也可以直接javah命令,稍微麻烦一点,需要先build工程,然后在build目录中找到class文件,再执行javah命令,复制.h文件拷贝到jni目录。
下面是生成后.h文件:
生成的.h文件中的方法名Java_com_example_ndkdemo_firstndkdemo_JniTest_getName实际上就是Java_包名类名方法名。
下面在jni目录下新建.c文件first.c,
#include "com_example_ndkdemo_firstndkdemo_JniTest.h"
JNIEXPORT jstring JNICALL Java_com_example_ndkdemo_firstndkdemo_JniTest_getName
(JNIEnv *env, jobject jobject1) {
return (*env)->NewStringUTF( env,"hello my first jni");
}
新建Android.mk文件,用于向构建系统描述源文件和共享库。
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := demo
LOCAL_SRC_FILES := first.c
include $(BUILD_SHARED_LIBRARY)
LOCAL_MODULE与build.gradle中.so文件的命名一致,生成的就是.so文件的名称。
LOCAL_SRC_FILES指向的是你的.c文件
新建Application.mk文件,用于描述应用需要的原生模块。
APP_MODULES := demo
APP_ABI := all
通过配置的ndk-build生成.so文件:
生成后的目录:
接下来就是调用.c文件中的方法:
MainActivity中调用:
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
((TextView) findViewById(R.id.tv_jni)).setText(new JniTest().getName());
}
}
运行结果: