Native Develop Kit,是Android 的一部分,与Java无直接关系
androidstudio2.2开始支持的比较老的方式,主要依赖于配置文件Android.mk与Application.mk
一、首先新建空白AndroidStudio工程
新建空白androidstudio工程,定义jni方法如下
public class MainActivity extends AppCompatActivity {
static {
System.loadLibrary("jni_demo");
}
public native String getStringFromC();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Toast.makeText(this, new MainActivity().getStringFromC(), Toast.LENGTH_SHORT).show();
}
}
二、使用javah生成头文件
移动头文件到app/jni目录下
cd app/src/main/java
javah com.hs.androidjnidemo.MainActivity
新建jni_demo.cpp或者jni_demo.c,名称与System.loadLibrary保持一致
Jni_demo.cpp内容如下
注意:cpp的NewStringUTF入参只有一个,同时env不需要*env
#include "com_hs_androidjnidemo_MainActivity.h"
#include "jni.h"
#include <stdio.h>
JNIEXPORT jstring JNICALL Java_com_hs_androidjnidemo_MainActivity_getStringFromC (JNIEnv *env, jobject obj) {
return env->NewStringUTF("string from cpp");
}
Jni_demo.c内容如下
#include "com_hs_androidjnidemo_MainActivity.h"
#include "jni.h"
#include <stdio.h>
JNIEXPORT jstring JNICALL Java_com_hs_androidjnidemo_MainActivity_getStringFromC (JNIEnv *env, jobject obj) {
return (*env)->NewStringUTF(env,"string from c");
}
三、配置ndk开发环境
local.properties配置ndk路径
ndk.dir=/Users/zhanglei/Library/Android/sdk/ndk/22.0.7026061
app/build.gradle/android中配置ndk加载libs
sourceSets {
main {
jniLibs.srcDirs = ['libs']
}
}
四、配置ndk-build编译环境
4.1、Android.mk
新建Android.mk,注意入口文件jni_demo.cpp保持一致
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := jni_demo
LOCAL_SRC_FILES := jni_demo.cpp
include $(BUILD_SHARED_LIBRARY)
调用my-dir函数,返回Android.mk文件所在的目录
LOCAL_PATH := $(call my-dir) 放在第一行,地址当前所在目录
include file Makefile可以引入其他的Makefile文件
include $(CLEAR_VARS) 编译模块时,清空LOCAL_MODULE等参数
LOCAL_MODULE 模块名称
LOCAL_SRC_FILES 编译需要的源文件
LOCAL_C_INCLUDES 需要的头文件
LOCAL_SHARED_LIBRARIES 编译需要的动态库
4.2、Application.mk
新建Application.mk
APP_PLATFORM := android-14
APP_ABI :=all
五、编译生成so
cd到jni入口目录,执行
ndk-build
执行结果如下。其中obj文件夹可以删除
点击运行成功如下