zoukankan      html  css  js  c++  java
  • JNI编程新手入门:Java和C++的超简单交互

    系统环境

    Mac OS X Yosemite 10.10.5

    java version "1.8.0_51"

    摘要

    简单介绍什么是JNI(Java Native Interface)。通过一个 HelloWorld 小程序,实现通过 Java 调用 C++ 打印 “ Hello Wolrd ” 。

    什么是JNI

    在编程领域, JNI (Java Native Interface,Java本地接口)是一种编程框架,使得 Java 虚拟机中的 Java 程序可以调用本地应用/或库,也可以被其他程序调用。 本地程序一般是用其它语言( C 、 C++ 或汇编语言等)编写的, 并且被编译为基于本机硬件和操作系统的程序。

    定义摘自维基百科。简而言之,通过JNI可以使 Java 程序和 C++ 程序直接通信交互,不需要通过
    如 .exe 等可执行文件流的方式去实现的交互。

    编程实例

    光说概念其实可能也是看得云里雾里,不如直接就用一个实例来更加直观的了解JNI编程吧。现在我们来写一个简单的 HelloWorld 小程序

    首先创建一个 JniTest.java 文件 , 键入如下代码保存即可

    public class JniTest {
    
      //导入lib文件
      static
      {
    		System.loadLibrary("jnitest");
      }
    
      public JniTest()
      {
        //init()  
      }
      // 调用 c++ 代码的函数
      public native void printHelloWorld();
    
      public static void main(String[] args) {
    		new JniTest().printHelloWorld();
    
    	}
    }
    

    接着在终端控制台,执行

    javac JniTest.java
    

    若成功执行就会生成相应的 JniTest.class 文件。接着执行

    javah JniTest
    

    若成功执行就会生成 JniTest.h 文件。文件里已经根据我们的 java 代码自动生成了相应的 c++ 代码,代码如下:

    
    /* DO NOT EDIT THIS FILE - it is machine generated */
    #include <jni.h>
    /* Header for class JniTest */
    
    #ifndef _Included_JniTest
    #define _Included_JniTest
    #ifdef __cplusplus
    extern "C" {
    #endif
    /*
     * Class:     JniTest
     * Method:    printHelloWorld
     * Signature: ()V
     */
    JNIEXPORT void JNICALL Java_JniTest_printHelloWorld
      (JNIEnv *, jobject);
    
    #ifdef __cplusplus
    }
    #endif
    #endif
    
    

    那一长串以 JNIEXPORT 开头的函数就是我们的函数接口。接着我们再创建一个相应的 JniTest.cpp 文件 ,实现 .h 中的函数,记得要包含 .h 头文件。

    
    #include <jni.h>
    #include "JniTest.h"
    #include <stdio.h>
    
    JNIEXPORT void JNICALL Java_JniTest_printHelloWorld
      (JNIEnv *, jobject)
    {
        printf("HelloWorld
    ");
    }
    
    

    到这里我们的主要代码编写就已经完成啦。但要让它跑起来还需要一点其他的操作。我们首先要编译.cpp文件,这里可以直接在命令行使用 g++ -c JniTest.cpp命令。但是此时这么键入是会报错的,它会提示:

    JniTest.cpp:2:10: fatal error: 'jni.h' file not found
    #include <jni.h>
             ^
    1 error generated.
    

    因为默认的头文件的搜索路径上是没有 jni.h文件的。我们先得找到 jni.h文件在哪里。MacOS下,它的文件路径在 /Library/Java/JavaVirtualMachines/jdk1.8.0_51.jdk/Contents/Home/include (根据JDK版本不同,需要修改中间jdk文件夹的名字,不过最开始的 /Library/Java/JavaVirtualMachines/ 一般是不会变的)除了 jni.h 之外,我么还需要 jni_md.h 它就在上述的include文件下的 darwin文件下,我们可以先在.cpp文件的目录下创建 include 文件夹,然后把上述的两个文件拷进去。接着执行

    g++ -c JniTest.cpp -I ./include
    

    若成功就会生成JniTest.o的目标文件,接着再执行

    g++ -dynamiclib -o libjnitest.jnilib JniTest.o
    

    就会生成libjnitest.jnilib文件,注意! 生成的文件名命名一定要是 lib + "java中读取的库文件名(如jnitest)" + .jnilib 否则java载入库文件将会失败!然后我们在终端键入

    java JniTest
    

    就会看到终端打印出HelloWorld了 ! 我们的Hello World小程序就完成啦!


    我的个人主页:http://amoyzhp.com/
  • 相关阅读:
    禁止使用U盘和移动硬盘
    Linux下Red5安装和配置
    ORACLE 10g下载地址
    常挂在美国人嘴边的最酷口语
    关于oracle中spfile和pfile的一个实验
    nginx搭建流媒体服务器
    powerDesigner 把name项添加到注释(comment),完美方案!
    memcached全面剖析–PDF总结篇
    PD 导出SQL语句
    本地读取虚拟机系统中的资源
  • 原文地址:https://www.cnblogs.com/amoy-zhp/p/7518840.html
Copyright © 2011-2022 走看看