美文网首页
如何引用C/C++代码进入Studio里

如何引用C/C++代码进入Studio里

作者: 崽子猪 | 来源:发表于2019-05-27 21:24 被阅读0次

    什么是JNI(Java Native Interface)呢?

    Java Native Interface(JNI)标准是java平台的一部分,JNI是Java语言提供的Java和C/C++相互沟通的机制,Java可以通过JNI调用C/C++代码,C/C++的代码也可以调用Java代码。

    JNI即为java的本地接口(C和C++开发的接口)由于JNI是JVM规范的一部分,因此我们可以将我们写的JNI程序在任何实现了JNI规范的Java虚拟机中运行.这个特性使我们可以复用以前大量的C和C++代码.

    开发JNI程序会受到系统环境的限制.因为用C/C++写出来的代码和模块,编译过程当中要依赖当前操作系统环境所提供的一些函数库,并和本地库链接在一起.而且编译后生成的二进制代码只能在本地操作系统的环境下运行,因为不同的操作系统环境,有自己本地库和CPU指令集,而且各个平台堆标准C/C++的规范和标准库函数实现方式也有区别.这就造成了JNI接口的Java程序不再像以前那样自由的跨平台.如果要实现跨平台,就必须将本地代码在不同的操作平台编译出相应的动态库

    JNI的作用:使得Java与本地其他类型语言交互(C/C++)。即在Java代码里调用c、c++等语言代码或者c、c++代码调用java代码.

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

    ---> 1.编写声明了native方法的类

    ---> 2.将Java源代码编译成class字节码文件

    ---> 3.用javah-jni命令生成.h头文件

    ---> 4.用本地代码实现.h文件中的函数

    ---> 5.将本地代码编译成动态库

    ---> 6.拷贝动态库至java.library.path本地库搜素目录下,并允许Java程序

    注意(Warring)

        1.JNI是java调用的Native语言的一种特性

        2.JNI是属于java的,与Android无直接关系

    为什么要又JNI呢?

        实际使用中,java需要与本地代码进行交互.因为java具备跨平台的特点,所有java与本地代码交互能力非常弱,所以采用JNI特性增强java与本地代码交互的能力


    什么是NDK?

    Native Development Kit(NDK)是一系列工具的集合。它提供了一系列的工具,帮助开发者快速开发C/C++的动态库,并能自动将so和java一起打包成apk。

    定义:Native Development Kit,是Android的一个工具开发包

    NDK是属于Android的,与java并无直接关系

    作用:快速开发c、c++的动态库,并自动将so和应用一起打包成APK

    即可通过NDK在android中,使用JNI与本地代码(如c、c++)交互

    应用场景:在Android的场景下使用JNI即Android开发的功能需要本地代码(c\c++)实现


    NDK开发具有以下有点:

    1、项目需要调用底层的一些C/C++的一些东西(java无法直接访问到操作系统底层(系统硬件等)),或者已经在C/C++环境下实现了功能代码(大部分现存的开源库都是用C/C++代码编写的。)直接使用即可。

    2、为了效率更加高效些。将要求高性能的应用逻辑使用C/C++开发,从而提高应用程序的执行效率。但是C/C++代码虽然是高效的,在java与C/C++相互调用时却增大了开销。

    3、基于安全性考虑。防止代码被反编译,为了安全起见,使用C/C++语言来编写重要的部分以增大系统的安全性,最后生成so库(用过第三方库的应该都不陌生)便于给人提供方便。

    4、便于移植。用C/C++写的库可以方便在其他的嵌入式平台上再次使用。

    NDK的特点

    注意事项

    NDK注意事项

    JNI和NDK的关系

    NDK可以为我们生成了C/C++的动态链接库,JNI是java和C/C++沟通过的接口,两者与android没有半毛钱关系,只因为安卓是java程序语言开发,然后通过JNI又能与C/C++沟通,所以我们可以使用NDK+JNI来实现Java+C的开发方式。

    关系流程图

    Studio实现步骤

    1.首先将NDK导入进来


    右上角三个蓝色小格子

        
    第二步骤与第三步骤都在Ctrl+Alt+S--->Tools--->Extermal Tools

    在哪里配置

    2.第二步将.javah导入

    Arguments:-classpath $ModuleFileDir$\src\main\java -jni -d $ModuleFileDir$\src\main\jni $FileClass$

    Working directory:$ModuleFileDir$\src\main\java

    导入.javah

    3.配置ndk

    Working directory:$ModuleFileDir$\src\main\

    ndk-build.cmd配置

    4.在build.gradle加入

    sourceSets {

        main.jniLibs.srcDirs = ['libs']

    }

    5.首先定义一个关于C/C++的代码

    6.右击找到External Tools--->javah - jni --->生成com_baidu_cdemo4_MainActivity.h文件

        7.将生成的.h文件复制一份改为.c

      8.修改部分代码

    .h:(JNIEnv *, jclass);

    .c:(JNIEnv *env, jclass clazz){

    char *a ="我是卫浩森的dad";

    return (*env)->NewStringUTF(env,a);

    };

    .h文件下
    .c文件下

    9.写入两个mk文件加入.c和.h同级别目录下

    Android.mk:(注意将Android.mk自动生成的jnittest.c切换成.c的类名)

    LOCAL_PATH := $(call my-dir)

    include $(CLEAR_VARS)

    LOCAL_MODULE := myLib

    LOCAL_SRC_FILES := 类名.c

    include $(BUILD_SHARED_LIBRARY)

    Application.mk:APP_ABI := all

    10.将生成的libs包拷贝到与app同级别的libs包下

    11.右击选择External Tools ---> ndk - build 

    操作流程

    12.回到主方法写一个代码块调用C/C++代码

    调用C/C++代码

    调用方法

    调用

    在Activity中测试调用,在TextView上显示我们通过C++代码实现的方法getStrFromC获取字符串。

    如果缺省jniLibs.srcDirs=[] 会报如下错误

    当调用so文件时必须在配置文件中配置如下图

    否则调用可能会有问题。将编译生成的中间文件和源代码删除。

    Android studio 下载NDK和构建工具

    1、Android原生开发工具包(NDK):这套工具集允许您开发Android使用C和C++代码,并提供众多平台库,让您可以管理原生Activity和访问物理设备组件,例如传感器和触摸输入。

    2、CMake:一款外部构建工具,可与Gradle搭配使用来构建原生库。如果您只计划使用ndk-build,则不需要此组件。

    3、LLDB:一种调试程序,Android Studio使用它来调试原生代码。

    您可以使用 SDK Manager安装这些组件:

    1、在打开的项目中,从菜单选择Tools > Android >SDK Manager.

    2、点击SDK Tools标签

    3、选中LLDB、CMake和NDK旁的复选框 如下图所示:

    创建支持 C/C++ 的新项目

    创建支持 原生代码 的项目与创建任何其他 Android Studio 项目类似,不过支持原生代码的项目还需要额外几个步骤:

    1. 在向导的 Configure your new project 部分,选中 Include C++ Support 复选框。

    2. 点击 Next。

    3. 正常填写所有其他字段并完成向导接下来的几个部分。

    4. 在向导的 Customize C++ Support 部分,您可以使用下列选项自定义项目

    5.C++ Standard:使用下拉列表选择您希望使用哪种 C++ 标准。选择 Toolchain Default 会使用默认的CMake 设置,这个选项如果你现在还不确定该选哪个,最好选择 C++11 的标准。

    6. Exceptions Support:如果您希望启用对 C++ 异常处理的支持,请选中此复选框。如果启用此复选框,Android Studio 会将 -fexceptions 标志添加到模块级 build.gradle 文件的 cppFlags 中,Gradle 会将其传递到 CMake。

    7. Runtime Type Information Support:如果您希望支持 RTTI,请选中此复选框。如果启用此复选框,Android Studio 会将 -frtti 标志添加到模块级 build.gradle 文件的 cppFlags 中,Gradle 会将其传递到 CMake。

    相关文章

      网友评论

          本文标题:如何引用C/C++代码进入Studio里

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