• 5.7 NDK开发


    JNI开发流程主要分为以下6步:

    1. 编写Java源代码
    2. 将Java源代码编译成class字节码文件
    3. 用javah -jni命令生成.h头文件(-jni参数表示将class中用native声明的函数生成jni规则的函数)
    4. 用本地代码实现.h头文件中的函数
    5. 将本地代码编译成动态库 (windows: *.dll ,linux/unix: *.so ,mac os x: *.jnilib )
    6. 拷贝动态库至  java.library.path 本地库搜索目录下,并运行Java程序

      JNI是Java众多开发技术中的一门,意在利用本地代码,为Java程序提供 更高效,更灵活的拓展。

      NDK是Google为Android进行本地开发而放出的一个本地开发工具, 包括Android的Native API、公共库以及编译工具, 注意,NDK需要Android 1.5版本以上的支持哦。

    简单来说,NDKJNI开发的一个扩展工具包!

      SDK是Google提供的Android标准开发工具包,里面包含了完整的 API文档,各Android版本的开发库,Android的虚拟机以及Android的打包工具等。众所周知,Android的应用开发语言是 Java,App的运行时是Delvik Runtime,属于JVM的改良版本,官方说Delvik VM更适用于移动设备。一般而言,由于Google的SDK提供了强大又完善的API,开发一般需求的应用,SDK足矣。然而前面已经说过,Java的运 行效率引发了不少问题,因而才有了JNI技术的存在。NDK是SDK的一个补充。

    SDKJNINDK的开发流程

    1. SDK开发,编写Java代码,调用各种Android的API实现功能,编写含有native关键字的代码开始JNI;
    2. JNI开发,按照 JNI编码规范,编写与Java交互的本地代码,一般就是数据类型的转换,把 C/C++的数据类转换成Java能识别的,或反过来。也因为这样子,我认为JNI其实就是Adapter,作为数据转换层而存在。
    3. C/C++开发,编码实现业务逻辑或调用NDK提供的本地API或库,完成Android平台上特定功能的开发、封装;
    4. NDK编译,编写.mk文件,编译调试,再修改.mk文件,针对特定的平台(ARM/x86)做编译结果的优化;
    5. 最后就是SDK编译、打包,上真机调试了...

     为什么使用NDK

    1. 代码的保护。由于apk的java层代码很容易被反编译,而C/C++库反汇难度较大。
    2. 可以方便地使用现存的开源库。大部分现存的开源库都是用C/C++代码编写的。
    3. 提高程序的执行效率。将要求高性能的应用逻辑使用C开发,从而提高应用程序的执行效率。
    4. 便于移植。用C/C++写得库可以方便在其他的嵌入式平台上再次使用:
      • NDK提供了一系列的工具,帮助开发者快速开发C(或C++)的动态库,并能自动将so和java应用一起打包成apk。这些工具对开发者的帮助是巨大的。
      • NDK集成了交叉编译器,并提供了相应的mk文件隔离CPU、平台、ABI等差异,开发人员只需要简单修改mk文件(指出“哪些文件需要编译”、“编译特性要求”等),就可以创建出so。

    Android Studio NDK开发

    环境搭建

    下载安装Android NDK,地址:http://developer.android.com/sdk/ndk/index.html

    Android Studio里面设置NDK路径:

    新建NDKDemo项目

    1) 新建一个类JniUtils用来实现native方法:

    public class JniUtils {

        public static native String getStringFromC();

    }

    2) Rebuild Project,生成JniUtils.class

    3) 在命令窗口定位到classesdebug目录下,执行命令(注意区分大小写)

    javah -jni com.smile.sample.ndkdemo.JniUtils

      此时会在debug目录下生成文件 com_smile_sample_ndkdemo_JniUtils.h

    4) 在app模块下,新建jni目录,并把头文件放到这个目录下。

    5)  新建一个cpp文件JniUtils.cpp来实现方法。此时需要做几个操作:

              i. 下载和配置NDK路径,修改build.gradle配置,在defaultConfig里面新增一下代码

    ndk {

         moduleName "JniDemo"

         abiFilters "armeabi", "armeabi-v7a", "x86"

     }

            ii. 在gradle.properties里面配置

    android.useDeprecatedNdk=true

    6) Jni目录下,新建一个cpp的空文件

      这是NDK在Windows下一个bug,当只编译一个文件时出现,解决方法就是再添加一个空的文件即可。

    7) 在JniUtils.cpp里面写入实现代码,比如:

    #include "com_smile_sample_ndkdemo_JniUtils.h"

    JNIEXPORT jstring JNICALL Java_com_smile_sample_ndkdemo_JniUtils_getStringFromC(JNIEnv * env, jclass obj){

        return env->NewStringUTF("这里是C++代码");

    }

    8) Rebuild Project,会在lib目录下生成三个子目录,里面有对应生成的.so文件

    9) 在JniUtils里面,加入加载so文件代码,就可以运行了

    static {

        System.loadLibrary("JniDemo");

    }

  • 相关阅读:
    如何进入闷声发大财的传统企业做数据分析工作,帮助企业做数字转型?
    做一个最好的自己,不盲目学数据分析
    sql server如何判断数据库是否存在
    c++引用深入探讨
    VirtualBox 安装ghost版windows XP
    QT透明显示文字
    CSAPP
    随机颜色的生成
    远程桌面如何传递声音的原理
    递归求解全排列
  • 原文地址:https://www.cnblogs.com/keyarchen/p/6062980.html
Copyright © 2020-2023  润新知