zoukankan      html  css  js  c++  java
  • eclipse上ndk环境的搭建&&so文件的生成&&jni文件的调用

    JNI是java语言提供的Java和C/C++相互沟通的机制,Java可以通过JNI调用本地的C/C++代码,本地的C/C++的代码也可以调用java代码。JNI 是本地编程接口,Java和C/C++互相通过的接口。Java通过C/C++使用本地的代码的一个关键性原因在于C/C++代码的高效性。

    NDK是一系列工具的集合 。它提供了一些列的工具,帮助开发者快速开发C/C++的动态库,并能自动将so和java应用一起打包成apk。它集成了交叉编译器,并提供了相应的mk文件隔离CPU,平台,ABI等差异,开发人员只需要简单修改mk文件(指出“哪些文件需要编译”、“编译特性要求”等),就可以创建出so。

    Java通过JNI机制和C/C++沟通的具体步骤

    1、编写包含native本地方法的java类
    2、通过javah工具生成C/C++语言的头文件
    3、使用C/C++语言实现头文件
    4、使用交叉编译工具对C/C++本地代码进行编译,最后通过链接生成*.so可执行的C/C++库
    5、实际执行Java代码去和本地的C/C++代码互相沟通

    NDK安装流程:

    在电脑已经配置了安卓环境的前提下,只需要下载NDK(R7以上的版本),这是个压缩包,解压可用。注:在R7之前的版本,必须要安装Cygwin才可使用NDK。从R7开始,Windows版本的NDK提供了一个ndk-build.cmd脚本,可以直接利用这个脚本编译。然后只要为Eclipse Android工程添加一个Builder,就能实现Eclipse的自动编译NDK:

    第一次生成so文件的时候,我们先使用NDK的sample下的hello-jni的例子。

    1、启动eclipse,通过Create project  from existing source,选择hello-jni的目录,按默认选项创建工程即可;

    2、观察hello-jni的工程目录结构,发现根目录下多了一个名叫jni的文件夹,该文件夹下面有两个文件,Android.mk和hello-jni.c。

         Android.mk是用来生成so文件的配置文件,我们来看看里面是什么:

    LOCAL_PATH := $(call my-dir)
    include $(CLEAR_VARS)

    LOCAL_MODULE    := hello-jni
    LOCAL_SRC_FILES := hello-jni.c

    include $(BUILD_SHARED_LIBRARY)

    include $(BUILD_SHARED_LIBRARY)表示会生成一个动态链接库,即so文件,生成的库文件名称为lib*.so

    LOCAL_MODULE    := hello-jni表示将要生成一个名称为libhello-jni.so的库文件

    LOCAL_SRC_FILES := hello-jni.c表示生成库文件的源文件是hello-jni.c

        打开hello-jni.c文件,会看到里面有一个函数:

    jstring Java_com_example_hellojni_HelloJni_stringFromJNI( JNIEnv* env, jobject thiz )
    {
        return (*env)->NewStringUTF(env, "Hello from JNI !");
    }

    这个函数从根据什么原则生成的呢?是根据src下的HelloJni.java文件中的函数 public native String  stringFromJNI();生成的。命名规则为:

    Java_(固定开头)com_example_hellojni(用"_"连接的包名)_HelloJni(类名)_stringFromJNI(函数名)

        这个函数的生成可以使用javah的命令:用命令行方式进入工程目录的binclasses目录下,运行javah com.example.hellojni.HelloJni,就会把所有native的函数都按规则生成在一个名为HelloJni.h的头文件里。

    3、新建并配置一个新的Builder

        1) 点击Project->Properties->Builders->New,新建立一个Builder。在弹出的对话框上面点击Program,点击OK;

        2) 在弹出的对话框【Edit Configuration】中,配置选项卡【Main】:

                   Location中需要填入nkd-build.cmd的路径(NDK安装目录下)。

                   WorkingDiretcoty中需要填入HelloJni的工程根目录。

        3) 在【EditConfiguration】中,配置选项卡【Refresh】:

                  勾选“Refresh resources upon completion”,

                  勾选“The entire workspace”,

                  勾选“Recuresively include sub-folders”。

        4)在【EditConfiguration】中,配置选项卡【Build Options】:

                 勾选“After a “Clean””,

                 勾选“During manual builds”,

                 勾选“During auto builds”,

                 勾选“Specify working set of relevant resources”。

                 点击“Specify Resources…”勾选TestNDK工程的“jni“目录,Finish!

          保存设置,点击OK。

    4、生成so文件

         由于我们勾选了“During auto builds”,所以在工程有所改变的时候,so文件便会自动编译,正确生成以后就能在工程目录下发现多了两个文件夹,文件夹libsarmeabi目录下生成了一个叫libhello-jni.so的文件。至此,使用NDK生成so文件的工作就完成了。

    5、so文件的调用

          在HelloJni.java文件中有一段代码:

        static {
            System.loadLibrary("hello-jni");
        }

        使用loadLibrary就可以加载该so文件了,加载的时候不需要写libhello-jni.so,只要写hello-jni就可以了。以上是eclispe+ndk+android的基础开发

    下面推荐这篇博客是eclispe +jdk 在简单的java工程中调用c程序:http://blog.csdn.net/zygang1988/article/details/7896071

  • 相关阅读:
    json数据在前端(javascript)和后端(php)转换
    几个提高效率的PHOTOSHOP秘密快捷键
    移动端ios针对input虚拟键盘挡住的问题
    前端适配移动端的方法
    完美兼容IE10以下所有版本
    vscode vue文件格式化没效果
    官网顶部的标题左移动
    模拟后台一次性返回所有数据
    关于上传图片的问题
    iframe标签在PC端的使用
  • 原文地址:https://www.cnblogs.com/yuanting/p/4921121.html
Copyright © 2011-2022 走看看