1.首先,as需要安裝ndk,如圖所示
2.下一步,在src/main 目錄下創(chuàng)建jni文件夾
3.在項目的build.gradle中添加如下代碼
···
android {
defaultConfig {
ndk{
moduleName "YanboberJniLibName" //生成的so名字
abiFilters "armeabi", "armeabi-v7a", "x86" //輸出指定三種abi體系結(jié)構(gòu)下的so庫。目前可有可無。
}
}
sourceSets {
main {
jni.srcDirs = []
jniLibs.srcDirs = ['libs'] // <-- 你的.so庫的實際路徑
}
}
}
···
4.創(chuàng)建jni方法聲明類融痛,例如
···
package io.github.yanbober.ndkapplication;
public class NdkJniUtils {
public native String getCLanguageString();
static {
System.loadLibrary("YanboberJniLibName"); //defaultConfig.ndk.moduleName
}
}
···
5.執(zhí)行javah生成.h文件
執(zhí)行javah的正確姿勢:
進(jìn)入app/src/main目錄:cd app/src/main
執(zhí)行javah命令:javah
javah -d jni -classpath ./Java io.github.yanbober.ndkapplication
-d jni 頭文件生成到j(luò)ni文件夾(當(dāng)前在<Project>\app\src\main目錄下,所以.h所在的目錄為<Project>\app\src\main\jni )
-classpath ./java 指定去當(dāng)前路徑下java下尋找包名指定的類
6.編寫對應(yīng)的C文件神僵,文件名任意取雁刷。C文件和前面生成的.h文件有較強的聯(lián)系,這里給出一個示例:
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架構(gòu)平臺的類型
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