1.app build gradle配置
在android 的defaultConfig域进行如下配置
externalNativeBuild {
cmake {
cppFlags ""
//生成多个版本的so文件
abiFilters 'armeabi-v7a'
}
}
在android域中进行如下配置
externalNativeBuild {
cmake {
path "src/main/cpp/CMakeLists.txt" // 设置所要编写的c源码位置,以及编译后so文件的名字
version "3.10.2"
}
}
2.CMakeList.txt中配置
cmake_minimum_required(VERSION 3.4.1)
add_library( # Sets the name of the library.
native-lib
# Sets the library as a shared library.
SHARED
# Provides a relative path to your source file(s).
native_src.c)
find_library( # Sets the name of the path variable.
log-lib
# Specifies the name of the NDK library that
# you want CMake to locate.
log )
target_link_libraries( # Specifies the target library.
native-lib
# Links the target library to the log library
# included in the NDK.
${log-lib})
3.c文件实现
#include <jni.h>
#include <assert.h>
#include <string.h>
#include <pthread.h>
#include <unistd.h>
#include <android/log.h>
#define TAG "HELLO"
#define LOGV(...) __android_log_print(ANDROID_LOG_VERBOSE, TAG, __VA_ARGS__)
#define LOGD(...) __android_log_print(ANDROID_LOG_DEBUG , TAG, __VA_ARGS__)
#define LOGI(...) __android_log_print(ANDROID_LOG_INFO , TAG, __VA_ARGS__)
#define LOGW(...) __android_log_print(ANDROID_LOG_WARN , TAG, __VA_ARGS__)
#define LOGE(...) __android_log_print(ANDROID_LOG_ERROR , TAG, __VA_ARGS__)
#ifndef NELEM
#define NELEM(A) (sizeof(A)/sizeof(A[0]))
#endif
static JavaVM* g_jvm;
//jstring JNICALL
//Java_com_example_myapplication_MainActivity_stringFromJNI(
// JNIEnv *env,
// jobject thiz/* this */) {
// char* hello = "Hello from C++";
// return (*env)->NewStringUTF(env, hello);
//}
jstring stringFromJNI(JNIEnv* env, jobject thiz)
{
// JNIEnv *env = NULL;
// //g_jvm->AttachCurrentThread(&env, NULL); //g_jvm为JavaVM指针
// (*g_jvm)->GetEnv(g_jvm, (void **) &env, JNI_VERSION_1_4);
return (*env)->NewStringUTF(env, "Hello from JNI !");
}
static JNINativeMethod methods[] = {
{"stringFromJni", "()Ljava/lang/String;", (void*)stringFromJNI},
};
JNIEXPORT jint JNI_OnLoad(JavaVM *vm, void *reserved)
{
JNIEnv* env = NULL;
g_jvm = vm;
jclass clazz;
static const char *classPathName = "com/example/debugnative/MainActivity";
if ((*vm)->GetEnv(vm, (void**) &env, JNI_VERSION_1_4) != JNI_OK) {
return -1;
}
assert(env != NULL);
clazz = (*env)->FindClass(env, classPathName);
LOGV("clazz = %d", clazz);
if((*env)->RegisterNatives(env, clazz, methods, NELEM(methods))<0) {
LOGV("RegisterNatives failed");
return -1;
}
LOGV("JNI_OnLoad success");
return JNI_VERSION_1_4;
}