环境要求(我的配置):
- JDK (1.8)
- Android Studio (2.1-b3)
- android-sdk (23 ) && andorid-ndk (r10e)
新建Android工程
- local.properties中配置上自己的环境
sdk.dir=E\:\\kerison\\k_android\\sdk
ndk.dir=E\:\\kerison\\k_android\\android-ndk-r10e
- module的build.gradle中配置so的输出信息
defaultConfig {
applicationId "cn.kerison.kjni"
minSdkVersion 15
targetSdkVersion 23
versionCode 1
versionName "1.0"
ndk{
moduleName "kjni_utils" //生成的so名字
ldLibs "log", "z", "m" //添加log依赖库文件
abiFilters "armeabi", "armeabi-v7a", "x86" //输出指定abi体系结构下的so库
}
}
- 如果要进行ndk调试 需在buildtype配置,然后debug app-native 会启动lldb server(我的启动了,但是暂时没成功,稍后尝试)
buildTypes {
debug {
jniDebuggable true
}
}
package cn.kerison.kjni.lib;
public class KEncrypt {
public native String genName(String name,int level);
static {
try {
System.loadLibrary("kjni_utils"); //kjni_utils为moduleName 配置的name
} catch (Exception pE) {
pE.printStackTrace();
}
}
}
- cd build\intermediates\classes\debug 下,调用javah 生成c头文件,然后复制到 main/jni 目录下
javah -jni cn.kerison.kjni.lib.KEncrypt
cn_kerison_kjni_lib_KEncrypt.h
- 此处有个小妙招,就是使用AS 提供的 External Tool利用宏自动创建头文件。
javah tools
类上右键自动javah生成头文件
//使用android的logcat输出日志,可不用
//文件:android_log.h
#ifndef KJNI_ANDROID_LOG_H
#define KJNI_ANDROID_LOG_H
#include <android/log.h>
#define IS_DEBUG
#ifdef IS_DEBUG
#define LOG_TAG ("KJNI_LOG")
#define LOGV(...) ((void)__android_log_print(ANDROID_LOG_VERBOSE, LOG_TAG, __VA_ARGS__))
#define LOGD(...) ((void)__android_log_print(ANDROID_LOG_DEBUG , LOG_TAG, __VA_ARGS__))
#define LOGI(...) ((void)__android_log_print(ANDROID_LOG_INFO , LOG_TAG, __VA_ARGS__))
#define LOGW(...) ((void)__android_log_print(ANDROID_LOG_WARN , LOG_TAG, __VA_ARGS__))
#define LOGE(...) ((void)__android_log_print(ANDROID_LOG_ERROR , LOG_TAG, __VA_ARGS__))
#else
#define LOGV(LOG_TAG, ...) NULL
#define LOGD(LOG_TAG, ...) NULL
#define LOGI(LOG_TAG, ...) NULL
#define LOGW(LOG_TAG, ...) NULL
#define LOGE(LOG_TAG, ...) NULL
#endif
#endif
//KJNI_ANDROID_LOG_H
//文件:k_encrypt.c
#include <jni.h>
#include <string.h>
#include <assert.h>
#include "cn_kerison_kjni_lib_KEncrypt.h"
#include "./utils/android_log.h"
#include "./encrypt/easy_encrypt.h"
/*
* Class: cn_kerison_kjni_lib_KEncrypt
* Method: genName
* Signature: (Ljava/lang/String;I)Ljava/lang/String;
*/
JNIEXPORT jstring JNICALL Java_cn_kerison_kjni_lib_KEncrypt_genName
(JNIEnv *env, jobject obj, jstring name, jint level){
//....
LOGD("call in native \n");
return (*env)->NewStringUTF(env, "from ndk");
}
KEncrypt encrypt = new KEncrypt();
Log.i("GK", encrypt.genName("gk", 2));