1、安装Android NDK
NDK版本的下载可参考如下博客中的连接,选择适合的版本下载:NDK版本下载
将下载到本地的NDK解压并进行环境变量配置,个人配置如下:
- 用户环境变量配置:新建NDK_HOME=F:\AndroidSDK\android-ndk-r16b
- 系统变量Path最后添加:;F:\AndroidSDK\android-ndk-r16b
- 验证配置是否成功:dos下输入ndk-build,出现如下图则为配置完成
2、编写java本地方法并生成.h头文件 - testdll.java
public class testdll
{
static
{
System.loadLibrary("hello");
}
public native static int get();
public native static void set(int i);
public static void main(String[] args)
{
testdll test = new testdll();
test.set(10);
System.out.println(test.get());
}
}
- dos下使用javac生成testdll.class文件,使用javah生成testdll.h头文件
testdll.h头文件内容如下:
#ifndef _Included_testdll
#define _Included_testdll
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: testdll
* Method: get
* Signature: ()I
*/
JNIEXPORT jint JNICALL Java_testdll_get
(JNIEnv *, jclass);
/*
* Class: testdll
* Method: set
* Signature: (I)V
*/
JNIEXPORT void JNICALL Java_testdll_set
(JNIEnv *, jclass, jint);
#ifdef __cplusplus
}
#endif
#endif
从头文件中可以看出javah命令为我们自动生成了java中native方法对应的C++头文件,下面按C++的方式实现该头文件中的内容:
testdll.cpp
#include "testdll.h"
int i = 0;
/*
* Class: testdll
* Method: get
* Signature: ()I
*/
JNIEXPORT jint JNICALL Java_testdll_get
(JNIEnv *, jclass)
{
return i;
}
/*
* Class: testdll
* Method: set
* Signature: (I)V
*/
JNIEXPORT void JNICALL Java_testdll_set
(JNIEnv *, jclass, jint j)
{
i = j;
}
3、生成so库文件
- 编写Android.mk文件,用于ndk编译生成so库文件
Android.mk
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE :=hello//此处的hello为即将要生成的so库文件的名字
LOCAL_SRC_FILES := testdll.cpp testdll.h
include $(BUILD_SHARED_LIBRARY)
此时的文件夹下包含以下文件:
- 使用ndk编译
在上图所示的文件夹下打开dos窗口,键入如下命令:
回车后的即可进行编译,结果如下:
同时在当前目录下生成了两个文件夹,其中包含了生成的库:
至此,通过运行java即可实现java的native方法调用C++的过程