• JNI与NDK简介


      最近稍微了解一下JNI和NDK. 网上各种教程给人一种二者不分的感觉, 经过自己运行代码, 将两者的关系理了一下.

        就目前了解,JNI应该是java自带的一种调用c和c++等语言(native code)的一个机制.而NDK指的是android-ndk,一种在安卓上使用native code的工具.也就是说,在通常的JVM上,我们用的是JNI,而在android上,则首选NDK(因为也可以使JNI,但是比较麻烦,后面将提及).

        一.首先说JNI.

        新建一个普通的Java Application.

        1.首先我们需要一个java类,用来调用native code(尽管此时native code 还没有生成),设文件名为Nadd.java,内容如下:

        package com.hello.jnitest;

        public class Nadd{

            static{

                System.loadLibrary("Nadd");

            }

        }

        2.生成.h文件.在1之后,工程的bin目录下应该有会有如下的目录及文件com/hello/jnitest/Nadd.class.进入命令行,cd 到bin文件夹,输入如下命令:

        javah com.hello.jnitest.Nadd

        以上命令会在当前目录(bin)下生成com_hello_jnitest_Nadd.h文件.

     3.编写.c文件.需要自己新建com_hello_jintest_Nadd.c文件.内容如下:

       #include  <</span>stdlib.h>

       #include  "com_hello_jnitest_Nadd.h"

     

       JNIEXPORT jint JNICALL Java_com_hello_jnitest_Nadd_nadd(

        JNIEnv  *  env,

        jobject c,

        jint a,

        jint b) {

          return  (a+b);

       }

        4.生成.so文件.cd到.h和.c文件所在的目录(通过上面步骤应该是bin文件夹),输入命令:

        gcc -I /.../jdk1.7.0_07/include/ -I /.../jdk1.7.0_07/include/linux/ -shared -fpic com_example_testjni_Nadd.c -o libadd.so

        上面的...根据个人实际情况而定,反正就是要找到jdk的路径.

        5.在工程目录下新建一个lib文件夹,把libadd.so放到里面.然后右键工程->Properties->Java Build Path,找到Source,展开Source folders on build path里面的工程,编辑Native library location,把location path设为刚才的lib文件夹.

        6.与native code相关的工作就做完了,其它部分可以如同普通工程一样.比如新建一个Nadd类的对象,使用其函数等.

     

        二.其次是NDK.

        ndk其实更简单.

        1.也需要一个java类,参考上面JNI中的1.

        1.Android.mk文件和.c文件.新建一个android application.然后在工程根目录下新建一个jni文件夹,里面新建一个Android.mk文件,一个.c文件.Android.mk文件可以参考ndk自带的sample/hello-jni里面的.关键是LOCAL_MODULE和LOCAL_SRC_FILES要写对.c文件里面的函数名有一定的格式,要与1中的java类的包名和类名对应,写法可以参考上面的com_hello_jintest_Nadd.c,但是我们不需要.h文件.这个有待进一步研究.

        2.终端cd到工程目录下,输入ndk-build.如果Android.mk和.c文件都对,会生成一个obj目录,在libs下目录下也会生成armeabi目录和其底下的*so文件.

        3.其余部分就同其它android程序一样了.

        4.补充:网上说可以通过一中JNI的方法生成*so文件,然后自己建libs/armeabi并把*so文件放进去,没有试过,我想应该可以.还有说把*so文件,用adb push 到什么地方,也可以吧.但是我感觉使用NDK,建mk文件和.c文件更简单一点,所需要的目录树都建好了,不必自己操心.

  • 相关阅读:
    JS中null与undefined的区别
    <div> <p> <span>的用法和区别
    <img>的title和Alt有什么区别?
    null undefined NaN
    JavaScript中判断为整数的多种方式
    将博客搬至CSDN
    flex
    webpack插件url-loader使用规范
    Cordova 项目 加载不出XML文件
    pandas读取xlsx
  • 原文地址:https://www.cnblogs.com/zhizhizhiyuan/p/3195262.html
Copyright © 2020-2023  润新知