JNI入门教程之HelloWorld篇

转载 2004年12月30日 15:17:00
本文讲述如何使用JNI技术实现HelloWorld,目的是让读者熟悉JNI的机制并编写第一个HelloWorld程序。

    Java Native Interface(JNI)是Java语言的本地编程接口,是J2SDK的一部分。在java程序中,我们可以通过JNI实现一些用java语言不便实现的功能。通常有以下几种情况我们需要使用JNI来实现。

  • 标准的java类库没有提供你的应用程序所需要的功能,通常这些功能是平台相关的
  • 你希望使用一些已经有的类库或者应用程序,而他们并非用java语言编写的
  • 程序的某些部分对速度要求比较苛刻,你选择用汇编或者c语言来实现并在java语言中调用他们

    在《java核心技术》中,作者提到JNI的时候,建议不到万不得已不要使用JNI技术,一方面它需要你掌握更多的知识才可以驾驭,一方面使用了JNI你的程序就会丧失可移植性。在本文我们跳过JNI的底层机制,读者最好先把它想象为本地代码和java代码的粘合剂。关系如下图所示:
20041113144221539.gif

 

 

 

 





 

 

 

    下面我们开始编写HelloWorld程序,由于涉及到要编写c/c++代码因此我们会在开发中使用Microsoft VC++工具。

  1. 编写java代码
    我们在硬盘上建立一个hello目录作为我们的工作目录,首先我们需要编写自己的java代码,在java代码中我们会声明native方法,代码非常简单。如下所示
    class HelloWorld
    {
        public native void displayHelloWorld();
        static {
            System.loadLibrary("hello");
        }
       
        public static void main(String[] args) {
            new HelloWorld().displayHelloWorld();
        }
    }
    注意我们的displayHelloWorld()方法的声明,它有一个关键字native,表明这个方法使用java以外的语言实现。方法不包括实现,因为我们要用c/c++语言实现它。注意System.loadLibrary("hello")这句代码,它是在静态初始化块中定义的,系统用来装载hello共享库,这就是我们在后面生成的hello.dll(如果在其他的操作系统可能是其他的形式,比如hello.so)
  2. 编译java代码
    javac HelloWorld.java  生成HelloWorld.class文件
  3. 创建.h文件
    这一步中我们要使用javah命令生成.h文件,这个文件要在后面的c/c++代码中用到,我们运行
    javah HelloWorld。这样我们可以看到在相同目录下生成了一个HelloWorld.h文件,文件内容如下
    在此我们不对他进行太多的解释。
    /* DO NOT EDIT THIS FILE - it is machine generated */
    #include <jni.h>
    /* Header for class HelloWorld */
    #ifndef _Included_HelloWorld
    #define _Included_HelloWorld
    #ifdef __cplusplus
    extern "C" {
    #endif
    /*
     * Class:     HelloWorld
     * Method:    displayHelloWorld
     * Signature: ()V
     */
    JNIEXPORT void JNICALL Java_HelloWorld_displayHelloWorld
      (JNIEnv *, jobject);
    #ifdef __cplusplus
    }
    #endif
    #endif
  4. 编写本地实现代码
    在这部分我们要用C/C++语言实现java中定义的方法,我们在VC++中新建一个Project,然后创建一个HelloWorldImp.cpp文件,内容如下
    #include <jni.h>
    #include "HelloWorld.h"
    #include <stdio.h>

    JNIEXPORT void JNICALL
    Java_HelloWorld_displayHelloWorld(JNIEnv *env, jobject obj)
    {
        printf("Hello world!/n");
        return;
    }
    注意我们这里include了 jni.h和刚才得到的HelloWorld.h文件。因此你要在VC++里面设置好,jni.h在JAVA_HOME/include里面。编译通过后再生成hello.dll文件。
  5. 运行java程序
    把上面生成的hello.dll文件复制到我们的工作目录,这时候我们的目录中包括HelloWorld.java,HelloWorld.class和hello.dll文件。运行java HelloWorld命令,则可在控制台看到Hello world|
    的输出了。

    JNI是一门复杂,有趣且富有挑战性的技术,我们在后面的几篇文章中将说明如何在java语言和Native语言之间进行交互。

JNI入门教程之HelloWorld篇

   本文讲述如何使用JNI技术实现HelloWorld,目的是让读者熟悉JNI的机制并编写第一个HelloWorld程序。     Java Native Interface(JNI)是Java语言...
  • mingjava
  • mingjava
  • 2004年11月14日 08:59
  • 84736

JNI入门教程之HelloWorld篇

本文讲述如何使用JNI技术实现HelloWorld,目的是让读者熟悉JNI的机制并编写第一个HelloWorld程序。     Java Native Interface(JNI)是Java语言的本地...
  • ACCP_2008123456
  • ACCP_2008123456
  • 2010年02月23日 09:49
  • 571

JNI入门教程之HelloWorld篇

http://www.wangchao.net.cn/bbsdetail_1754615.html      本文讲述如何使用JNI技术实现HelloWorld,目的是让读者熟悉JNI的机制并编...
  • cc_lq
  • cc_lq
  • 2011年10月27日 20:28
  • 298

Java 之JNI基础篇(一)

JNI,即Java Native Interface。它其实就是一套java与本地代码交互的接口或者说是一个协议。通俗的比喻,就是中国人讲中国话,日本人讲日本话,于是中国人碰到日本人,各说各话,无法交...
  • yingshukun
  • yingshukun
  • 2018年01月13日 18:51
  • 9996

JNI入门教程之HelloWorld篇

本文讲述如何使用JNI技术实现HelloWorld,目的是让读者熟悉JNI的机制并编写第一个HelloWorld程序。    Java Native Interface(JNI)是Java语言的本地编...
  • songbaojie
  • songbaojie
  • 2007年10月30日 09:59
  • 431

Android studio jni 入门helloworld

最近忙着面试 ,基本上每个面试官都会问一句 会不会jni?会不会ndk?像我这么厉害的c和c++,难道真的要荒废了吗,说了你会别人又不听,那么 我就得写个jni来试试了,说了这么多,要不是一本正经的胡...
  • salute_li
  • salute_li
  • 2016年09月08日 11:15
  • 1081

jni入门教程之HelloWorld

简介 Java Native Interface(JNI)是Java语言的本地编程接口,是J2SDK的一部分。在java程序中,我们可以通过JNI实现一些用java语言不便实现的功能。通常有以下几种...
  • cheerfor2008
  • cheerfor2008
  • 2013年08月30日 19:46
  • 356

Java 之JNI基础篇(二)

上一篇完成了JNI流程的编写,现在来看看javah命令生成的本地方法 #include #include #include "Hello.h" JNIEXPORT void JNICALL...
  • yingshukun
  • yingshukun
  • 2018年01月21日 14:11
  • 9903

Android模拟器学framework和driver之传感器篇6(Android 通过JNI连接驱动层和framework)

之前,我们已经实现了android HAL层,在android模拟器上移植了一个虚拟的temperature sensor,我之前在模拟器上也移植了backlight,RTC等驱动,都能在应用层得到需...
  • zhangjie201412
  • zhangjie201412
  • 2012年02月08日 08:57
  • 5019

NDK配置及JNI入门教程之HelloWorld篇

在Android Studio中使用C/C++库有两种方式:cmake和ndk-build。cmake是最新支持的方法,通过配置CMakeLists.txt文件来实现;ndk-build是传统的方式,...
  • ShareUs
  • ShareUs
  • 2016年04月06日 10:08
  • 678
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:JNI入门教程之HelloWorld篇
举报原因:
原因补充:

(最多只允许输入30个字)