一、简单了解
NDK全名:Native Development Kit
由Google提供,帮助开发C/C++动态共享库,在Android上运行
二、下载配置
下载地址:
https://developer.android.com/ndk/downloads/index.html环境配置(Linux环境)
- 下载的linux下的压缩包解压后的目录:
/home/jiana/Android/android-ndk-r12b
- vim打开环境配置文件
$sudo vim /etc/profile
当前配置:
ANT_HOME=/home/jiana/app/apache-ant-1.9.7
JAVA_HOME=/usr/java/jdk1.8.0_91
PATH=$JAVA_HOME/bin:$PATH:$ANT_HOME/bin
CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:/home/jiana/文档/javaStudy:/home/jiana/workspace
export JAVA_HOME PATH CLASSPATH ANT_HOME
添加NDK配置后:
NDK_HOME=/home/jiana/Android/android-ndk-r12b
ANT_HOME=/home/jiana/app/apache-ant-1.9.7
JAVA_HOME=/usr/java/jdk1.8.0_91
PATH=$JAVA_HOME/bin:$PATH:$ANT_HOME/bin:$NDK_HOME
CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:/home/jiana/文档/javaStudy:/home/jiana/workspace
export JAVA_HOME PATH CLASSPATH ANT_HOME NDK_HOME
- 重启电脑
- 测试是否配置成功
$ ndk-build
三、编写JNI程序
简介:JNI全名Java Native Interface,java代码调用其他语言代码的接口。
- 简单案例实现,步骤:(Android studio项目中)
- 功能:返回传入的参数
- activity_main.xml添加一个按钮
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="New Button"
android:onClick="btnClick" />
</RelativeLayout>
- MainActivity中添加Button点击事件,和
native
声明的方法
public void btnClick(View view) {
Button btn = (Button) view;
btn.setText(say("hello world"));
}
public native String say(String value);
- 生成
.h
头文件:1.到项目的java目录。2.命令:javah -jni 包名+类名
- 创建放C/C++代码的目录:项目/app目录右击 > New > Folder > JNI Folder > Finish
出现jni目录:项目名/app/src/main/jni
将头文件io_xujiaji_nativetest_MainActivity.h
放进jni目录 - jni目录下创建一个C文件
say.c
#include "io_xujiaji_nativetest_MainActivity.h"
JNIEXPORT jstring JNICALL Java_io_xujiaji_nativetest_MainActivity_say
(JNIEnv * env, jobject obj, jstring say){
return say;
}
- 生成动态链接库
- 在jni目录添加动态链接库配置文件
Android.mk
- 在jni目录添加动态链接库配置文件
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := say
LOCAL_SRC_FILES := say.c
include $(BUILD_SHARED_LIBRARY)
```
意义:
LOCAL_PATH:编译的路径
include $(CLEAR_VARS):清除一些LOCAL_XXX样式的模块
LOCAL_MODULE:定义模块的名称
include $(BUILD_SHARED_LIBRARY):编译的是动态链接库
- 编译
命令进入jni目录下编译:ndk-build
Android studio项目配置
- 在
local.properties
添加ndk目录:
ndk.dir=/home/jiana/Android/android-ndk-r12b
- 在gradle.properties添加:
android.useDeprecatedNdk=true
- 在app/build.gradle的defaultConfig{}中添加:
ndk{
moduleName "say"//mk中定义的模块名
}
- 在MainActivity中加载动态链接库
static {
System.loadLibrary("say");
}
运行
↓↓↓
↓↓↓