安装ndk:
下载ndk:
在你装好了Android studio 的sdk环境的前提下进行ndk开发。
打开android studio,Tools->Android->SDKManager->Android SDK->SDK Tools.勾上LLDB,NDK。
已经勾上的其他选项不用管,让他处于勾中状态。下载就行了,默认是下载到sdk下有一个文件叫ndk-bundle,大概两个多G。
我的路径: D:\software_install_path\android_studio\sdk\ndk-bundle
配置环境变量:
加一个系统变量:name:NDK_ROOT value:D:\software_install_path\android_studio\sdk\ndk-bundle(ndk-bundle的路径,看你自己下载在哪里)
在系统变量path的末尾加上;%NDK_ROOT%
这样就配置好了
ndk开发:
native方法:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
TextView tv=(TextView) findViewById(R.id.tv_helloworld);
tv.setText(getStrFromJNI());
}
public native String getStrFromJNI();
.h文件:
先cd进入工程包前面的路径。
再javah -jni 类的全路径名。
没报错的话就是成功了,这是发现android studio有一个.h文件生成
.c文件:
android studio切换到Project,再app下新建一个jni的文件夹,在里面建一个demo.c文件。
文件里面的内容是:
#include <jni.h>
jstring Java_com_example_liurenyou_ndk_MainActivity_getStrFromJNI(JNIEnv *env,jobject thiz) {
return (*env)->NewStringUTF(env, "hello world from jni");
}
可以发现方法名字和.h文件名字一样,而且还有规律。Java_类的全路径名的变体再加上native名字。熟悉了就可以不用生成.h文件了
mk文件:
在jni下面建一个Android.mk文件 里面的内容是
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := demo
LOCAL_SRC_FILES := demo.c
include $(BUILD_SHARED_LIBRARY)
用来编译so文件。
so文件:
cmd进入app的路径,然后ndk-build,就会发现多了libs和obj两个文件夹,obj没有用,可以删了
两个配置:
项目的根目录下有一个local.properties文件
在app下的build.gradle的android节点下面加上
sourceSets{
main{
jniLibs.srcDirs=['libs']
}
}
so文件使用:
在MainActivity类里面加上
static {
System.loadLibrary("demo");
}
这个库demo(完整的名字是libdemo.so)会在第一次使用MainActivity这个类的时候加载。(static代码块声明的代码会先于onCreate方法执行)
第一个helloworld from jni: