安卓基于NDK开发,从环境搭建到demo运行

注:本教程基于最新的Android sudio3.3,自己仅作记录,一些具体解释可以到

1、环境搭建

 

       

2、demo开发

  • build.gradle中配置ndk相关信息
android {
    compileSdkVersion 28
    defaultConfig {
        applicationId "com.android.jniapp"
        minSdkVersion 14
        targetSdkVersion 28
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
        ndk {
            //指定生成模块名字,也就是最终的动态库名RsaEncryptUtils_jni,相应库文件名
            //RsaEncryptUtils_jni.so         
            moduleName "RsaEncryptUtils_jni"
            //标准库
            stl "stlport_staic"
            //不加的话  .h文件打log 会报undefined reference to '__android_log_print'
            //so库中输出log必须加
            ldLibs "log"
            // 指定生成哪些处理器架构的动态库文件,如果要运行在x86架构处理器一定需要指定 
            abiFilters "armeabi-v7a", "x86"
        }
    }
  • c++文件
    # include <jni.h>
    # include <stdio.h>
    # include <android/log.h>
    //方法名必须为本地方法的全类名点改为下划线,穿入的两个参数必须这样写,
    //第一个参数为Java虚拟机的内存地址的二级指针,用于本地方法与java虚拟机在内存中交互
    //第二个参数为一个java对象,即是哪个对象调用了这个 c方法
    //如果本地代码是C++(.cpp或者.cc),要使用extern "C" { }把本地方法括进去
    //JNIEXPORT jstring JNICALL中的JNIEXPORT 和 JNICALL不能省
    //关于方法名Java_scut_carson_1ho_ndk_1demo_MainActivity_getFromJNI
    //格式 = Java _包名 _ 类名_Java需要调用的方法名
    //Java必须大写
    //对于包名,包名里的.要改成_,_要改成_1
    extern "C"
    {
        JNIEXPORT jstring JNICALL Java_com_android_jniapp_MainActivity_getEncryptData(JNIEnv *env, jobject obj ){
        //so库log输出
        __android_log_print(ANDROID_LOG_ERROR, "zj", "%s", "I love U!");
        return env -> NewStringUTF("Hello i am from JNI!");
        // 上述代码是返回一个String类型的"Hello i am from JNI!"字符串
        }
    }

     

  • Android.mk文件
  • LOCAL_PATH       :=  $(call my-dir)
    include              $(CLEAR_VARS)
    LOCAL_MODULE     :=  RsaEncryptUtils_jni
    LOCAL_SRC_FILES  :=  RsaEncryptUtils.cpp
    LOCAL_LDLIBS     := -llog
    include              $(BUILD_SHARED_LIBRARY)
  • Application.mk
    APP_ABI := armeabi-v7a x86
    APP_PLATFORM := android-16

    Add 

关于.h文件的生成配置(转载两张图)

关于.cpp文件的生成配置(我这边不行。。。)

可使用AndroidStudio来直接生成cpp函数实现,方法如下,直接在native方法上按alt+enter生成:

参考文章

 

android NDK下log的使用和封装 https://blog.csdn.net/u012005313/article/details/52059053

Android:JNI 与 NDK到底是什么?(含实例教学) https://blog.csdn.net/carson_ho/article/details/73250163

Android NDK-0.Android Studio NDK快速生成.h头文件和native函数声明 https://blog.csdn.net/hgy413/article/details/82842768

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值