使用 android studio进行开发。 编译环境是 Android.mk.
首先,新建一个 android project 也不用 勾选 C++的选项,因为我这里不使用 CMake
首先 简单配置一下 Android.mk 和 Application.mk 这两个文件 简历在main 目录下面的 jni 文件夹中。
同时 .cpp 文件也放在这个文件夹里面。
在build.gradle 中配置 简单的 NDK 信息。
defaultConfig {
applicationId ""
minSdkVersion 21
targetSdkVersion 26
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
ndk{
moduleName "hello-test"
abiFilters "armeabi-v7a"
}
}
android 标签下添加
sourceSets.main {
// jniLibs.srcDirs = ['src/main/jniLibs','libs']
jniLibs.srcDirs = ["src/main/libs"] //指向要使用的库文件//的路径,前边的是自己项目的,后边的是第三方的so
jni.srcDirs=[] //禁止gradle 自动编译,使用已经编译好的So库
}
放在android标签外面
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 中的配置 —— 详细说明自行google
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := hello-test
LOCAL_SRC_FILES := helloTest.cpp
include $(BUILD_SHARED_LIBRARY)
Application.mk 中的配置—— 详细说明请看官方文档
APP_OPTIM := release
APP_PLATFORM := android-9
APP_ABI := armeabi-v7a //APP_ABI := all代表生成所有平台的库文件
APP_STL := gnustl_static
APP_CPPFLAGS :=-O3 -std=c++11 -frtti -fexceptions
java 中的code
static {
ystem.loadLibrary("hello-test");
}
public static native String helloJni();
对应的 C++ code ,C++与C 是用区别的
#include <string.h>
#include <jni.h>
extern "C" { // 声明编译环境是 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 .");
}
每个native函数,都至少有两个参数(JNIEnv*,jclass或者jobject)。
1)当native方法为静态方法时:
jclass 代表native方法所属类的class对象(JniTest.class)。
2)当native方法为非静态方法时:
jobject 代表native方法所属的对象。
最后会自动生成jniLibs目录