Java通过JNI调用C++程序

  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,这个头文件是根据包名和类名来命名的。

 1 / DO NOT EDIT THIS FILE - it is machine generated /
 2 #include
 3 / Header for class com_test_TestNative /
 4
 5 #ifndef _Included_com_test_TestNative
 6 #define _Included_com_test_TestNative
 7 #ifdef cplusplus
 8 extern “C“ {
 9 #endif
10 /
11   Class:     com_test_TestNative
12   Method:    sayHello
13   Signature: ()V
14  /
15 JNIEXPORT void JNICALL Java_com_test_TestNative_sayHello
16   (JNIEnv , jobject);
17
18 #ifdef cplusplus
19 }
20 #endif
21 #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添加到该工程中,然后创建一个源文件引用该头文件并且实现头文件
中本地函数的功能:

1     #include
2     #include“com_test_TestNative.h“
3
4     JNIEXPORT void JNICALL Java_com_test_TestNative_sayHello(JNIEnv *env, jobject obj)
5     {
6         cout<<“hello world!“<<endl;
7     }

 

  这里因为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调用本地函数

 1 package com.test;
 2
 3 public class TestNative {
 4     public native void sayHello();
 5
 6     /*
 7       @param args
 8      */
 9     public static void main(String[] args) {
10         System.loadLibrary(“NativeCode”);
11         TestNative tNative = new TestNative();
12         tNative.sayHello();
13     }
14 }

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

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

时间: 2024-12-02 21:43:38

Java通过JNI调用C++程序的相关文章

Java通过JNI调用C语言的方法

JAVA以其跨平台的特性深受人们喜爱,而又正由于它的跨平台的目的,使得它和本地机器的各种内部联系变得很少,约束了它的功能. 解决JAVA对本地操作的一种方法就是JNI. JAVA通过JNI调用本地方法,而本地方法是以库文件的形式存放的(在WINDOWS平台上是DLL文件形式,在UNIX机器上是SO文件形式).通过调用本地的库文件的内部方法,使JAVA可以实现和本地机器的紧密联系,调用系统级的各接口方法. 简单介绍及应用如下: 一.JAVA中所需要做的工作 在JAVA程序中,首先需要在类中声明所调

java用jni调用下面C++,如何传参取值

问题描述 java用jni调用下面C++,如何传参取值 #include <iostream> #include <afx.h> #include <tchar.h> #include <ctime> #include<winsock.h> unsigned char posmstkey[9]={0x12,0x23,0x35,0x56,0x55,0x33,0x98,0x11}; char starC[56],starD[56],starK[17]

Java通过JNI调用libcurl导致JVM崩溃

问题描述 通过Java的JNI调用libcurl导致JVM崩溃,不知道什么原因大家帮看看,并不是刚上来就崩溃,而是执行一段就崩溃,JVM崩溃的log如下:##AfatalerrorhasbeendetectedbytheJavaRuntimeEnvironment:##SIGSEGV(0xb)atpc=0x0000003163221ca2,pid=12648,tid=47588522796480##JREversion:6.0_23-b05#JavaVM:JavaHotSpot(TM)64-Bi

linux java 通过jni调用 中文出现乱码

问题描述 linuxjava通过jni调用传递字符串到c++,或是从c++传递到java,中文出现乱码系统的编码如下:-bash-3.2$vim/etc/sysconfig/i18n1LANG="en_US"2SUPPORTED="en_US:en"3SYSFONT="lat0-sun16"4SYSFONTACM="iso01"在网上查了些资料,windows下的可以解决了,调用size=WideCharToMultiByte

求救,java通过JNI调用C++ dll

问题描述 环境:win7+VS2008+eclipse问题:java调用release的dll中的一个函数第三次时出错,前两次都正常,第三次调用时Java代码进入调用dll中该函数的地方编辑器就死掉了,只能强制停止才能结束调试,没有报任何错误,dll也没反馈任何值.vs附加进行方式调试,每次都能正常运行注:在三次调用该函数时,dll的其它函数也被调用,没有出现什么异常.环境:server2003+eclipse同样的代码,dll为release版,第一次调用报错,重新调用就会正常代码无法往外考,

关于Java使用JNI调用C++动态库进行回调的问题

问题描述 最近需要学习JNI去调用C++动态链接库,所以写了个小实例试下JAVA调用C++库中的回调问题.代码如下JAVA层代码packagezm.com;publicclassLog{/***@paramargs*/static{//System.loadLibrary("JniLib");System.load("C:\VC_TEST\JniLib\Debug\JniLib.dll");}publicvoidoutput(Stringout){System.ou

java 通过jni调用c#dll ,抛出异常

问题描述 ##AfatalerrorhasbeendetectedbytheJavaRuntimeEnvironment:##InternalError(0xe0434352),pid=8256,tid=6488##JREversion:7.0_13-b20#JavaVM:JavaHotSpot(TM)ClientVM(23.7-b01mixedmode,sharingwindows-x86)#Problematicframe:#C[KERNELBASE.dll+0xc6e3]RaiseExce

jni调用java方法报错!!!

问题描述 jni调用java方法报错!!! 12-04 11:33:08.818: A/art(23825): art/runtime/check_jni.cc:70] JNI DETECTED ERROR IN APPLICATION: calling static method java.lang.String com.library.utils.MD5Utils.md5(java.lang.String) with CallObjectMethod 12-04 11:33:08.818:

我要做一个毕业设计,向网页输入一组数据,调用matlab程序,结果返回给网页,请问要怎么实现

问题描述 我要做一个毕业设计,向网页输入一组数据,调用matlab程序,结果返回给网页,请问要怎么实现 50C matlab程序是一个关于灰色关联度计算的,现在大概知道框架是这样,现在问题是网页怎么调用matlab程序 解决方案 http://www.cnblogs.com/Key-Ky/p/4266213.html 解决方案二: java 的实现方式.用java的jni 调用c++动态库.再将数据封装返回.再把数据返回到页面