1.首先,as需要安装ndk,如图所示
2.下一步,在src/main 目录下创建jni文件夹
3.在项目的build.gradle中添加如下代码
···
android {
defaultConfig {
ndk{
moduleName "YanboberJniLibName" //生成的so名字
abiFilters "armeabi", "armeabi-v7a", "x86" //输出指定三种abi体系结构下的so库。目前可有可无。
}
}
sourceSets {
main {
jni.srcDirs = []
jniLibs.srcDirs = ['libs'] // <-- 你的.so库的实际路径
}
}
}
···
4.创建jni方法声明类,例如
···
package io.github.yanbober.ndkapplication;
public class NdkJniUtils {
public native String getCLanguageString();
static {
System.loadLibrary("YanboberJniLibName"); //defaultConfig.ndk.moduleName
}
}
···
5.执行javah生成.h文件
执行javah的正确姿势:
进入app/src/main目录:cd app/src/main
执行javah命令:javah
javah -d jni -classpath ./Java io.github.yanbober.ndkapplication
-d jni 头文件生成到jni文件夹(当前在<Project>\app\src\main目录下,所以.h所在的目录为<Project>\app\src\main\jni )
-classpath ./java 指定去当前路径下java下寻找包名指定的类
6.编写对应的C文件,文件名任意取。C文件和前面生成的.h文件有较强的联系,这里给出一个示例:
jnitest.c
···
include "io_github_yanbober_ndkapplication_NdkJniUtils.h"
/*
- Class: io_github_yanbober_ndkapplication_NdkJniUtils
- Method: getCLanguageString
- Signature: ()Ljava/lang/String;
*/
JNIEXPORT jstring JNICALL Java_io_github_yanbober_ndkapplication_NdkJniUtils_getCLanguageString
(JNIEnv env, jobject obj){
return (env)->NewStringUTF(env,"This just a test for Android Studio NDK JNI developer!");
}
···
io_github_yanbober_ndkapplication_NdkJniUtils.h
···
/* DO NOT EDIT THIS FILE - it is machine generated */
include <jni.h>
/* Header for class io_github_yanbober_ndkapplication_NdkJniUtils */
ifndef _Included_io_github_yanbober_ndkapplication_NdkJniUtils
define _Included_io_github_yanbober_ndkapplication_NdkJniUtils
ifdef __cplusplus
extern "C" {
endif
/*
- Class: io_github_yanbober_ndkapplication_NdkJniUtils
- Method: getCLanguageString
- Signature: ()Ljava/lang/String;
*/
JNIEXPORT jstring JNICALL Java_io_github_yanbober_ndkapplication_NdkJniUtils_getCLanguageString
(JNIEnv *, jobject);
ifdef __cplusplus
}
endif
endif
···
7.编写Amdroid.mk文件,这里给出示例
···
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := YanboberJniLibName
LOCAL_SRC_FILES := jnitest.c
include $(BUILD_SHARED_LIBRARY)
···
其中
LOCAL_MODULE表示模块名称
LOCAL_SRC_FILES表示需要参与编译的源文件
除了这两个,其他照搬即可
8.编写Application.mk文件,这里给出示例
···
APP_ABI := armeabi
···
用作配置要编译的CPU架构平台的类型
9.将.h 、.c 、Android.mk、Application.mk文件都放入jni文件夹中
10.生成so文件
在jni的上一级目录,使用命令
ndk-build
即可在main目录下生成libs文件夹包含so文件,将其移动到app/libs目录下即可
最后附上原文链接
http://blog.csdn.net/qq_26819733/article/details/69061664