• Android之NDK环境配置+JNI开发+so文件编译


    前言

    这边Android作为日常记录,虽然破坏了文章队形~   最近人工智能挺火的,也稍微了解了一些库,比如关于视觉库openCV。要在安卓下调用这些C/C++库,需要用到JNI开发,在此把过程分享一下。

    概念

    JNI:Java Native Interface的缩写。提供了API供java和其他语言通信,主要是C/C++。

    NDK:Native Development Kit,是 Android的一个工具开发包 ,快速开发C、 C++的动态库,并自动将so文件和应用一起打包成 APK。

    JNI和NDK关系:在Android中通过NDK,使用JNI与本地Java代码交互。

    分析

    分析要做的事情

    1、配置NDK环境。(这里用的安卓开发工具是Android studio,as的配置就不细说了)

    2、编写C/Cpp文件。

    3、编译生成so文件供原生安卓调用。

    4、编写本地native方法。

    配置NDK环境

    方式一:在线配置

    • 打开sdk manager
    • 点击sdk tools
    • 勾选CMake、LLDB、NDK,点击install。

    慢慢等吧......顺利的话下载完点击APPLY--->OK,那么恭喜。如果提示下载失败,很大可能是没掌握科学上网=。=!!,此时可以试试方式二。

    方式二:离线安装

    • 下载NDK离线安装包并解压,修改文件夹名字为ndk-bundle,放在你安装Android studio的sdk目录下,重启android studio就可以了。(推荐下载地址AndroidDevTools.com,资源较为干净放心)
    • 不想放在sdk目录下的可以解压到任何一个盘,点击android studio --> file --> project structure --> SDK location --> Android NDK Location设置ndk目录,重启android studio。

    关联NDK与项目:

    1、gradle --> local.properties -->添加配置 ndk.dir=/Users/susan/Android/sdk/ndk-bundle。  (一般情况下这句是自动加上的,假如你的ndk在sdk目录下)

    2、gradle --> gradle.propertiess -->添加配置 android.useDeprecatedNdk=true。 (一般情况下也是自动加的)

    3、在gredle.build中添加ndk节点。

            

    4、创建本地ImgFun.cpp文件,注意位置位于jni文件夹中。

    # include <jni.h>
    # include <stdio.h>
    
    extern "C"
    {
       /*表示返回一个字符串  方法名称格式:Java_包名_类名_方法名(这个方法名java要调用的)
    *参数
    *1. JNIEnv:代表了VM里面的环境,本地的代码可以通过该参数与Java代码进行操作
       *2. obj:定义JNI方法的类的一个本地引用(this)
      */ 

    JNIEXPORT jstring JNICALL Java_com_hong_demo_MyNative_getInfo(JNIEnv
    *env, jobject obj ){
    return env -> NewStringUTF("Hello,树先生!");
    }
    }

    5、jni文件夹下创建Android.mk文

    LOCAL_PATH :=  $(call my-dir)
    // 设置工作目录,而my-dir则会返回Android.mk文件所在的目录
    include $(CLEAR_VARS)
    // 清除几乎所有以LOCAL——PATH开头的变量(不包括LOCAL_PATH)
    LOCAL_MODULE :=  hello_jni
    // 设置模块的名称,即编译出来.so文件名
    // 注,要和上述步骤中build.gradle中NDK节点设置的名字相同
    LOCAL_SRC_FILES :=  test.cpp
    // 指定参与模块编译的C/C++源文件名
    include $(BUILD_SHARED_LIBRARY)
    // 指定生成的静态库或者共享库在运行时依赖的共享库模块列表。

    6、jni文件夹下创建Application.mk文件

    APP_ABI := armeabi armeabi-v7a
    // 最常用的APP_ABI字段:指定需要基于哪些CPU平台的.so文件
    // 常见的平台有armeabi x86 mips,其中移动设备主要是armeabi平台
    // 默认情况下,Android平台会生成所有平台的.so文件,即同APP_ABI := armeabi x86 mips
    // 指定CPU平台类型后,就只会生成该平台的.so文件,即上述语句只会生成armeabi平台的.so文件

    7、编译生成so文件。控制终端进入jni目录,执行 ndk-build 命令即可。

    8、本地调用so文件中的方法。

    // 步骤1:加载生成的so库文件
        // 注意要跟.so库文件名相同
        static {
            System.loadLibrary("ImgFun");
        }
        // 步骤2:定义在JNI中实现的方法
        public native String getInfo();

    9、整体代码结构

                          

    最后说明,有几点参考的文章: https://www.jianshu.com/p/38859f881888   质量和画风都非常赞呢~

  • 相关阅读:
    flex学习小结
    Frameset框架
    表格的增删改
    【实践】用 js 封装java shuffle函数(打乱数组下标方法)
    【实践】js封装 jq siblings 方法
    【笔记】js原生方法 在元素外部或内部实现添加元素功能(类似jq 的 insert 和 append)
    【实践】js实现windows系统日历
    【实践】用for-in 循环实现三联联动
    【笔记】js Array.prototype.slice.call(arguments) 将函数的参数转换为数组方法的见解
    【笔记】js Function类型 内部方法callee
  • 原文地址:https://www.cnblogs.com/hongdiandian/p/9025089.html
Copyright © 2020-2023  润新知