NDK开发

作者: 卖梦想的男孩 | 来源:发表于2016-04-21 17:02 被阅读257次

    环境要求(我的配置):

    • 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));
    

    相关文章

      网友评论

          本文标题:NDK开发

          本文链接:https://www.haomeiwen.com/subject/komtrttx.html