使用 android studio進(jìn)行開(kāi)發(fā)。 編譯環(huán)境是 Android.mk.
首先,新建一個(gè) android project 也不用 勾選 C++的選項(xiàng),因?yàn)槲疫@里不使用 CMake
首先 簡(jiǎn)單配置一下 Android.mk 和 Application.mk 這兩個(gè)文件 簡(jiǎn)歷在main 目錄下面的 jni 文件夾中。
同時(shí) .cpp 文件也放在這個(gè)文件夾里面。
在build.gradle 中配置 簡(jiǎn)單的 NDK 信息。
defaultConfig {
applicationId ""
minSdkVersion 21
targetSdkVersion 26
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
ndk{
moduleName "hello-test"
abiFilters "armeabi-v7a"
}
}
android 標(biāo)簽下添加
sourceSets.main {
// jniLibs.srcDirs = ['src/main/jniLibs','libs']
jniLibs.srcDirs = ["src/main/libs"] //指向要使用的庫(kù)文件//的路徑,前邊的是自己項(xiàng)目的,后邊的是第三方的so
jni.srcDirs=[] //禁止gradle 自動(dòng)編譯,使用已經(jīng)編譯好的So庫(kù)
}
放在android標(biāo)簽外面
task ndkBuild(type: Exec) {
commandLine '/Users/bushetianzhen/Library/Android/sdk/ndk-bundle/ndk-build', '-C', file('src/main/jni').absolutePath
}
tasks.withType(JavaCompile) {
compileTask -> compileTask.dependsOn ndkBuild
}
Android.mk 中的配置 —— 詳細(xì)說(shuō)明自行g(shù)oogle
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := hello-test
LOCAL_SRC_FILES := helloTest.cpp
include $(BUILD_SHARED_LIBRARY)
Application.mk 中的配置—— 詳細(xì)說(shuō)明請(qǐng)看官方文檔
APP_OPTIM := release
APP_PLATFORM := android-9
APP_ABI := armeabi-v7a //APP_ABI := all代表生成所有平臺(tái)的庫(kù)文件
APP_STL := gnustl_static
APP_CPPFLAGS :=-O3 -std=c++11 -frtti -fexceptions
java 中的code
static {
ystem.loadLibrary("hello-test");
}
public static native String helloJni();
對(duì)應(yīng)的 C++ code ,C++與C 是用區(qū)別的
#include <string.h>
#include <jni.h>
extern "C" { // 聲明編譯環(huán)境是 C
// 聲明JNI 的方法
JNIEXPORT jstring JNICALL Java_com_dressplus_androidndk_ndkUtils_HelloTest_helloJni(JNIEnv* env, jobject obj);
};
jstring Java_com_dressplus_androidndk_ndkUtils_HelloTest_helloJni(JNIEnv* env, jobject obj)
{
return env->NewStringUTF("Hello from JNI ! Compiled with ABI .");
}
每個(gè)native函數(shù),都至少有兩個(gè)參數(shù)(JNIEnv*,jclass或者jobject)。
1)當(dāng)native方法為靜態(tài)方法時(shí):
jclass 代表native方法所屬類(lèi)的class對(duì)象(JniTest.class)。
2)當(dāng)native方法為非靜態(tài)方法時(shí):
jobject 代表native方法所屬的對(duì)象。
最后會(huì)自動(dòng)生成jniLibs目錄