您的当前位置:首页NDK开发

NDK开发

2024-12-13 来源:哗拓教育

环境要求(我的配置):

  • 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    
}
}
  • 编写java native抽象层代码
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生成头文件
  • 编写具体c实现
//使用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));
显示全文