• JNI学习笔记--HelloWorld篇


     

    出自:http://wenku.baidu.com/link?url=X_plf2x-5OL9FOhLoGtA6JjfS5ivKKFF7m7fvwdnL0vWxi4Ulr-tZCS1UZ_ml20-sVYWwqXE4qcxAeWS7v-kCi5lpZ3ku9qxaoStoVmMeVS

     

     

    JNI入门教程之HelloWorld篇

    资料引用:http://www.knowsky.com/363050.html

    本文讲述如何使用JNI技术实现HelloWorld,目的是让读者熟悉JNI的机制并编写第一个HelloWorld程序。

      Java Native Interface(JNI)是Java语言的本地编程接口,是J2SDK的一部分。在java程序中,我们可以通过JNI实现一些用java

    语言不便实现的功能。通常有以下几种情况我们需要使用JNI来实现。

      标准的java类库没有提供你的应用程序所需要的功能,通常这些功能是平台相关的你希望使用一些已经有的类库或者应用程序,而他们并非用

    java语言编写的程序的某些部分对速度要求比较苛刻,你选择用汇编或者c语言来实现并在java语言中调

    用他们在《java核心技术》中,作者提到JNI的时候,建议不到万不得已不要使用JNI技术,一方面它需要你把握更多的知识才可以驾驭,一方面使用了

    JNI你的程序就会丧失可移植性。在本文我们跳过JNI的底层机制,读者最好先把它想象为本地代码和java代码的粘合剂。关系如下图所示:

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

      编写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

     

     

    编译

    java

    代码

     

    javac HelloWorld.java

     

    生成

    HelloWorld.class

    文件

     

     

     

     

    创建

    .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

     

    编写本地实现代码

     

    在这部分我们要用

    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! ");

     

     

     

     

    return;

    }

    注重我们这里

    include

     

    jni.h

    和刚才得到的

    HelloWorld.h

    文件。

    因此你要在

    VC++

    里面设置

    好,

    jni.h

    JA

    V

    A_HOME/include

    里面。编译通过后再生成

    hello.dll

    文件。

     

     

    运行

    java

    程序

     

    hello.dll

    HelloWorld.java

    HelloWorld.class

    hello.dll

    文件。运行

    java HelloWorld

    命令,则可在控制

    台看到

    Hello world

     

     

    的输出了。

     

     

     

     

    -

     

    资料引用

    :http://www.knowsky.com/363050.html

     

     

    Java: JNI

    完全手册时间

    :2007-02-10 00:00:00

     

    来源

    :

     

    作者

    :

     

     

    最近在公司里做了一个手机的项目,

    需要

    JA

    V

    A

    程序在发送短信的时候和第三方的短信服务

    器连接。

    短信接口是用

    C++

    写的。

    琢磨了三天,

    大致搞懂了

    JNI

    的主体部分。

    先将心得整理,

    希望各位朋友少走弯路。

     

     

    首先引用一篇文章,介绍一个简单的

    JNI

    的调用的过程。

     

     

    JA

    V

    A

    以其跨平台的特性深受人们喜爱,而又正由于它的跨平台的目的,使得它和本地机器

    的各种内部联系变得很少,约束了它的功能。解决

    JA

    V

    A

    对本地操作的一种方法就是

    JNI

     

     

    JA

    V

    A

    通过

    JNI

    调用本地方法,

    而本地方法是以库文件的形式存放的

    (在

    WINDOWS

    平台上

    DLL

    文件形式,在

    UNIX

    机器上是

    SO

    文件形式)

    。通过调用本地的库文件的内部方法,

    使

    JA

    V

    A

    可以实现和本地机器的紧密联系,调用系统级的各接口方法。

     

     

    简单介绍及应用如下:

     

     

     

    一、

    JA

    V

    A

    中所需要做的工作

     

     

     

    JA

    V

    A

    程序中,首先需要在类中声明所调用的库名称,如下:

     

     

     

     

     

    static {

     

     

    System.loadLibrary(“goodluck”);

     

     

    }

     

     

     

    在这里,库的扩展名字可以不用写出来,究竟是

    DLL

    还是

    SO

    ,由系统自己判断。

     

     

     

    还需对将要调用的方法做本地声明,关键字为

    native

    。且只需要声明,而不需要具体实现。

    如下:

     

     

     

     

     

     

    public native static void set(int i);

     

     

    public native static int get();

     

     

     

    然后编译该

    JA

    V

    A

    程序文件,生成

    CLASS

    ,再用

    JA

    V

    AH

    命令,

    JNI

    就会生成

    C/C++

    的头文

    件。

     

     

     

    例如程序

    testdll.java

    ,内容为:

     

     

     

     

    public class testdll

     

     

    {

     

     

    static

     

     

    {

     

     

    System.loadLibrary("goodluck");

     

     

    }

     

     

    public native static int get();

     

     

    public native static void set(int i);

     

     

    public static void main(String[] args)

     

     

    {

     

     

    testdll test = new testdll();

     

     

    test.set(10);

     

     

    System.out.println(test.get());

     

     

    }

     

     

    }

     

    javac testdll.java

    编译它,会生成

    testdll.class

     

     

     

     

     

    再用

    javah testdll

    则会在当前目录下生成

    testdll.h

    文件,

    这个文件需要被

    C/C++

    程序调用来

    生成所需的库文件。

     

     

     

    二、

    C/C++

    中所需要做的工作

     

     

     

    对于已生成的

    .h

    头文件,

    C/C++

    所需要做的,就是把它的各个方法具体的实现。然后编译连

    接成库文件即可。再把库文件拷贝到

    JA

    V

    A

    程序的路径下面,就可以用

    JA

    V

    A

    调用

    C/C++

    实现的功能了。

     

     

     

    接上例子。我们先看一下

    testdll.h

    文件的内容:

     

     

     

     

    /* DO NOT EDIT THIS FILE - it is machine generated */

     

     

    #include

     

     

    /* Header for class testdll */

     

     

    #ifndef _Included_testdll

     

     

    #define _Included_testdll

     

     

    #ifdef __cplusplus

     

     

    extern "C" {

     

     

    #endif

     

     

    /*

     

     

    * Class: testdll

     

     

    * Method: get

     

     

    * Signature: ()I

     

     

    */

     

     

    JNIEXPORT jint JNICALL Java_testdll_get (JNIEnv *, jclass);

     

     

    /*

     

     

    * Class: testdll

     

     
     
     
     
     
     
     
     
     
     
     
  • 相关阅读:
    scrapy爬虫框架入门教程
    wing IDE破解方法
    python网络画图——networkX
    Flask Web Development —— Web表单(上)
    pandas聚合和分组运算——GroupBy技术(1)
    Python自然语言工具包(NLTK)入门
    python & pandas链接mysql数据库
    Win10家庭版怎么开启Administrator超级管理员帐户
    Echars保存图片
    Windowserver2008R2安装IIS环境
  • 原文地址:https://www.cnblogs.com/CoffeeHome/p/3554424.html
Copyright © 2020-2023  润新知