Java学习者论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

手机号码,快捷登录

恭喜Java学习者论坛(https://www.javaxxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,购买链接:点击进入购买VIP会员
JAVA高级面试进阶视频教程Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程

Go语言视频零基础入门到精通

Java架构师3期(课件+源码)

Java开发全终端实战租房项目视频教程

SpringBoot2.X入门到高级使用教程

大数据培训第六期全套视频教程

深度学习(CNN RNN GAN)算法原理

Java亿级流量电商系统视频教程

互联网架构师视频教程

年薪50万Spark2.0从入门到精通

年薪50万!人工智能学习路线教程

年薪50万!大数据从入门到精通学习路线年薪50万!机器学习入门到精通视频教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程 MySQL入门到精通教程
查看: 241|回复: 0

[默认分类] JAVA基础之理解JNI原理

[复制链接]
  • TA的每日心情
    开心
    2021-12-13 21:45
  • 签到天数: 15 天

    [LV.4]偶尔看看III

    发表于 2018-7-9 17:39:18 | 显示全部楼层 |阅读模式

    JNI是java标准平台中的一个重要功能,它弥补了JAVA的与平台无关这一重大优点的不足,在JAVA实现跨平台的同时,也能与其它语言(如C、C++)的动态库进行交互,给其它语言发挥优势的机会。


    有了JAVA标准平台的支持,使JNI模式更加易于实现和使用。在此总结了下面这个知识图:





    实例:


    环境说明:ubuntu 10.4.2 LTS系统


    程序清单1:src/com/magc/jni/HelloWorld.java



    1.    
    2.      1
    3.     /**
    4.    
    5.      2
    6.      *
    7.      3
    8.      
    9.     */
    10.    
    11.      4
    12.      
    13.     package
    14.      com.magc.jni;
    15.      5
    16.    
    17.      6
    18.      
    19.     /**
    20.    
    21.      7
    22.      *
    23.     @author
    24.      magc
    25.      8
    26.      *
    27.      9
    28.      
    29.     */
    30.    
    31.     10
    32.      
    33.     public
    34.      
    35.     class
    36.      HelloWorld {
    37.     11
    38.      
    39.     12
    40.      
    41.     static
    42.      {
    43.     13
    44.      
    45.     14
    46.      System.loadLibrary(
    47.     "
    48.     Hello
    49.     "
    50.     );
    51.     15
    52.      
    53.     16
    54.      }
    55.     17
    56.    
    57.     18
    58.      
    59.     public
    60.      
    61.     native
    62.      
    63.     void
    64.      DisplayHello();
    65.     19
    66.      
    67.     /**
    68.    
    69.     20
    70.      *
    71.     @param
    72.      args
    73.     21
    74.      
    75.     */
    76.    
    77.     22
    78.      
    79.     public
    80.      
    81.     static
    82.      
    83.     void
    84.      main(String[] args) {
    85.     23
    86.    
    87.     24
    88.      
    89.     new
    90.      HelloWorld().DisplayHello();
    91.     25
    92.      }
    93.     26
    94.    
    95.     27
    96.     }
    97.    
    复制代码
      进入src目录下,编译该JAVA类,


    命令:javac ./com/magc/jni/HelloWorld.java


    在该HelloWorld.java所在目录下生成HelloWorld.class


    然后使用javah生成头文件,


    命令:javah -jni com.magc.jni.HelloWorld


    在当前目录下生成com_magc_jni_HelloWorld.h头文件,此文件供C、C++程序来引用并实现其中的函数


    程序清单2:com_magc_jni_HelloWorld.h



    1.    
    2.      1
    3.     /*
    4.      DO NOT EDIT THIS FILE - it is machine generated
    5.     */
    6.    
    7.      2
    8.     #include
    9.     <
    10.     jni.h
    11.     >
    12.    
    13.      3
    14.      
    15.     /*
    16.      Header for class com_magc_jni_HelloWorld
    17.     */
    18.    
    19.      4
    20.    
    21.      5
    22.     #ifndef _Included_com_magc_jni_HelloWorld
    23.      6
    24.    
    25.     #define
    26.      _Included_com_magc_jni_HelloWorld
    27.    
    28.      7
    29.     #ifdef __cplusplus
    30.      8
    31.    
    32.     extern
    33.      
    34.     "
    35.     C
    36.     "
    37.      {
    38.      9
    39.    
    40.     #endif
    41.    
    42.     10
    43.    
    44.     /*
    45.    
    46.     11
    47.      * Class: com_magc_jni_HelloWorld
    48.     12
    49.      * Method: DisplayHello
    50.     13
    51.      * Signature: ()V
    52.     14
    53.      
    54.     */
    55.    
    56.     15
    57.     JNIEXPORT
    58.     void
    59.      JNICALL Java_com_magc_jni_HelloWorld_DisplayHello
    60.     16
    61.      (JNIEnv
    62.     *
    63.     , jobject);
    64.     17
    65.    
    66.     18
    67.     #ifdef __cplusplus
    68.     19
    69.     }
    70.     20
    71.    
    72.     #endif
    73.    
    74.     21
    75.    
    76.     #endif
    77.    
    复制代码



    注:1)、此头文件是不需要用户编译的,直接供其它C、C++程序引用。


          2)、此头文件中的Java_com_magc_jni_HelloWorld_DisplayHello
    (JNIEnv
    *
    , jobject)方法,是将来与动态链接库交互的接口,并需要名字保持一致。


      程序清单3:src/jni_helloworldImpl.cpp



    1.    
    2.     #include
    3.     <
    4.     jni.h
    5.     >
    6.    
    7. #include
    8.     "
    9.     com_magc_jni_HelloWorld.h
    10.     "
    11.    
    12. #include
    13.     <
    14.     stdio.h
    15.     >
    16.    
    17. JNIEXPORT
    18.     void
    19.      JNICALL Java_com_magc_jni_HelloWorld_DisplayHello
    20. (JNIEnv
    21.     *
    22.     env, jobject obj)
    23. {
    24. printf(
    25.     "
    26.     From jni_helloworldImpl.cpp :
    27.     "
    28.     );
    29. printf(
    30.     "
    31.     Hello world ! \n
    32.     "
    33.     );
    34.     return
    35.     ;
    36. }
    37.    
    复制代码



    此C++文件实现了上述头文件中的函数,注意方法函数名要保持一致。


    编译生成动态库libHello.so,


    命令:g++ -shared -I /usr/lib/JVM/java-6-openjdk/include jni_helloworldImpl.cpp -o libHello.so


    成功后,便会在当前目录下生成动态链接库libHello.so文件。


    有了具体实现的动态库后,就可以运行JAVA调用JNI程序类的native方法了,


    命令:java -Djava.library.path=. com.magc.jni.HelloWorld


    输入结果即为:
    From jni_helloworldImpl.cpp :Hello world !











      本文参考部分内容参考:


    1、http://www.iteye.com/topic/304594#814127


    2、《Android应用开发详解》
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|Java学习者论坛 ( 声明:本站资料整理自互联网,用于Java学习者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

    GMT+8, 2024-5-19 15:21 , Processed in 0.394526 second(s), 46 queries .

    Powered by Discuz! X3.4

    © 2001-2017 Comsenz Inc.

    快速回复 返回顶部 返回列表