Android NDK配置及生成so库

1、安装Android NDK
NDK版本的下载可参考如下博客中的连接,选择适合的版本下载:NDK版本下载
将下载到本地的NDK解压并进行环境变量配置,个人配置如下:

  • 用户环境变量配置:新建NDK_HOME=F:\AndroidSDK\android-ndk-r16b
    Android NDK配置及生成so库_第1张图片
  • 系统变量Path最后添加:;F:\AndroidSDK\android-ndk-r16b
    Android NDK配置及生成so库_第2张图片
  • 验证配置是否成功:dos下输入ndk-build,出现如下图则为配置完成
    Android NDK配置及生成so库_第3张图片
    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头文件
    Android NDK配置及生成so库_第4张图片
    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)

此时的文件夹下包含以下文件:
Android NDK配置及生成so库_第5张图片

  • 使用ndk编译
    在上图所示的文件夹下打开dos窗口,键入如下命令:
    Android NDK配置及生成so库_第6张图片
    回车后的即可进行编译,结果如下:
    Android NDK配置及生成so库_第7张图片
    同时在当前目录下生成了两个文件夹,其中包含了生成的库:
    Android NDK配置及生成so库_第8张图片
    至此,通过运行java即可实现java的native方法调用C++的过程

你可能感兴趣的:(安卓开发)