Java通过JNI调用C++程序

转载 2015年07月10日 08:26:42

      JNI是Java Native Interface的缩写,中文为JAVA本地调用。使用JNI可以很方便的用我们的Java程序调用C/C++程序。很多时候,某些功能用Java无法实现,比如说涉及到底层驱动的一些功能,这时候我们就可以利用JNI来调用C或者C++程序来实现,这就是JNI的强大之处。但是JNI也有它的缺点,使用java与本地已编译的代码交互,通常会丧失平台可移植性。

  下面是一个JNI例子,调用C++输出"hello world": 

第一步:创建Java类,在里面定义一个本地方法(用native关键字修饰的方法)

  public native void sayHello();

第二步:使用javah命令(javah  类的全路径)生成本地方法的C++头文件

  在DOS窗口中进入工程所在目录,然后执行javah com.test.TestNative命令,执行完之后就会在当前目录生成一个后缀名为.h的头文件,如com_test_TestNative.h,这个头文件是根据包名和类名来命名的。

/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class com_test_TestNative */

#ifndef _Included_com_test_TestNative
#define _Included_com_test_TestNative
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     com_test_TestNative
 * Method:    sayHello
 * Signature: ()V
 */
JNIEXPORT void JNICALL Java_com_test_TestNative_sayHello
  (JNIEnv *, jobject);

#ifdef __cplusplus
}
#endif
#endif

        15、16行是对TestNative类中的本地方法sayHello()的声明。这个h文件相当于我们在java里面的接口,这里声明了一个 Java_com_test_TestNative_sayHello (JNIEnv *, jobject);方法,然后在我们的本地方法里面实现这个方法,也就是说我们在编写C/C++程序的时候所使用的方法名必须和这里的一致。

第三步:编写C/C++本地代码,生成动态链接库文件

  首先在VC6.0(当然也可以用其他工具)中创建一个dll工程---Win32 Dynamic-Link Library工程。然后将上面生成的头文件com_test_TestNative.h添加到该工程中,然后创建一个源文件引用该头文件并且实现头文件中本地函数的功能:

#include<iostream.h>
    #include"com_test_TestNative.h"

    JNIEXPORT void JNICALL Java_com_test_TestNative_sayHello(JNIEnv *env, jobject obj)
    {
        cout<<"hello world!"<<endl;
    }

       这里因为com_test_TestNative.h中引入了jni.h所以要将jni.h加入到VC6.0安装目录下的Include目录中。jni.h在JDK安装目录下的include中,同时得件include/win32中的两个头文件jawt_md.h、jni_md.h也导入到VC6.0中。

  将所依赖的头文件导入之后,我们就可以构建该工程了,按F7就行了,完了会在工程目录中的Degug目录下生成一个动态链接库文件,我这里生成的是NativeCode.dll。我们就可以将该dll文件拷贝到环境变量path所包含的目录下给咱们的Java程序调用了,为了方便,我们也可以将dll所在的工程目录加入到环境变量path中去,这样可以避免每次都要拷贝的麻烦。注意修改环境变量之后要重启myeclipse。

第四步:Java调用本地函数

package com.test;

public class TestNative {
    public native void sayHello();
    
    /**
     * @param args
     */
    public static void main(String[] args) {
        System.loadLibrary("NativeCode");
        TestNative tNative = new TestNative();
        tNative.sayHello();    
    }
}

第10行是加载动态链接库,JVM只需要加载一次就可以调用了,“NativeCode”是上面生成的动态链接库的名字,不含后缀名。

  运行该程序,成功打印输出了"hello world"。

Android开发 通过JNI实现JAVA与C/C++程序间的调用和回调

在一些Android应用的开发中,需要通过JNI和 Android NDK工具实现JAVA和C/C++之间的相互调用。        Java Native Interface (JNI)标准是jav...
  • xhf_123
  • xhf_123
  • 2015年12月03日 19:58
  • 2346

JAVA通过JNI调用C++程序实践

整体思路:将需要调用的C++函数在java中声明一个对应的native函数,利用javah生成对应的h头文件,用C++封装成动态链接库,提供给java调用 实践步骤:1.声明需要调用的C++函数在j...
  • zeroctu
  • zeroctu
  • 2017年08月01日 17:46
  • 118

Java通过JNI调用C++程序

JNI是Java Native Interface的缩写,中文为JAVA本地调用。使用JNI可以很方便的用我们的Java程序调用C/C++程序。很多时候,某些功能用Java无法实现,比如说涉及到底层驱...

【转载整理】eclipse 开发c/c++、Java使用JNI调用C程序、生成64位dll动态链接库

eclipse 开发c/c++、Java使用JNI调用C程序、生成64位dll动态链接库

Java通过JNI调用C++程序

摘要:   JNI是Java Native Interface的缩写,中文为JAVA本地调用。使用JNI可以很方便的用我们的Java程序调用C/C++程序。很多时候,某些功能用Java无法实现...

从 C/C++ 程序调用 Java 代码 (不是用JNI)

这里要转一篇文章,写的简单易懂,这篇文章更像是C++混合Java代码混合编程; 但是要注意,这个方法不是用JNI方法,网上有很多Java调用C++的方法,一般是用JNI方法,Java应用编译好的动态链...

scala和java通过JNI调用C++程序例子

转载:http://hohonuuli.blogspot.com/2013/08/a-simple-java-native-interface-jni.html 主要是国内访问不了这个网站 Fi...
  • funy88
  • funy88
  • 2015年03月26日 10:34
  • 1698

JNI中在被调用的C/C++函数中如何访问Java程序中的类,并编写应用实例

1、在javah工具生成的C/C++函数声明中的JNIEnv类型参数和jobject类型参数的介绍 JNIEXPORT void JNICALL Java_jni_TestNative_sayhel...

一个java调用c++程序的实例(jni)

JNI是Java Native Interface的 缩写,允许Java代码和其他语言写的代码进行交互。 主要操作步骤: 1·编写带有native声明的方法的java类 public class...

Java通过JNI调用C++程序

JNI是Java Native Interface的缩写,中文为JAVA本地调用。使用JNI可以很方便的用我们的Java程序调用C/C++程序。很多时候,某些功能用Java无法实现,比如说涉及到底层驱...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Java通过JNI调用C++程序
举报原因:
原因补充:

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