JAVA调用c/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 <jni.h>
 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<iostream.h>
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-13 14:50:31

JAVA调用c/c++代码的相关文章

android开发教程(4)— jni编程之采用 javah 从java调用C++

用Java调用C/C++代码 当无法用 Java 语言编写整个应用程序时,JNI 允许您使用本机代码.在下列典型情况下,您可能决定使用本机代码: 希望用更低级.更快的编程语言去实现对时间有严格要求的代码. 希望从 Java 程序访问旧代码或代码库. 需要标准 Java 类库中不支持的依赖于平台的特性. 须知:SWIG和javah的区别(强烈推荐) 我看了网上的关于 jni编程 的教程很多,但不尽相同,刚开始会犯迷糊.我想笔者往往忽略了一个关键点,那就是采用了什么方式决定了步骤的流程.有两种生成

(转)java调用python脚本

这篇博客旨在吐血分享今天遇到的java调用python脚本遇到的坑,折腾了3个多小时终于可以跑通了,代码超级短,但网上的好多资料都是抄来抄去的,很少有能够直接跑通的,尤其是针对你的python文件中用到第三方类库的情况. 先来说说我为什么要用java调用python代码,原因就在于python在爬虫方面提供了丰富的类库,但我本来已经有一套java操作数据库以及消息中间件的代码,这些代码用python实现的话可能需要至少一周时间,为了减少时间成本,因此我决定用java调用python脚本的方式使用

java调用python脚本

常见的java调用python脚本方式 通过jython.jar提供的类库实现 (不建议使用,因为会报module没有找到的错误,总之就是很蛋疼,要设置一系列的参数) 通过Runtime.getRuntime()开启进程来执行脚本文件(建议使用,原因:简单粗暴我喜欢!!!)在这个里面注意:调用py脚本的时候,先用windows的dos界面去运行下 命令: python xxxx.py,测试,脚本可以调用,不然可能在java脚本就是调用了,但是就是失败了的情况,导致一直卡住,本人就是这样的一个情况

01_JNI是什么,为什么使用,怎么用JNI,Cygwin环境变量配置,NDK案例(使用Java调用C代码)

1 什么是JNI JNI Java本地开发接口 JNI是一个协议,这个协议用来沟通java代码和外部的本地代码(C/C++) 通过这个协议,java代码就可以调用外部的C/C++代码,外部的C/C++代码也可以调用Java代码. 2 为什么用JNI 1  JNI扩展了java虚拟机的能力,驱动开发(wifi-hotspot)2.3无线热点共享 2  Native code效率高,数学运算,实时渲染的游戏上,音视频处理(极品飞车),opengl,ffmpeg 3  复用代码(文件压缩,人脸识别)

java调用ruby代码

问题: 最近在做一个应用的时候碰到了一个问题.客户端需要调用服务器端传回的脚本信息,然后执行.其中脚本类型包括ruby.而java中调用ruby的代码大致如下: 1 String jrubyCode="puts 'hello world'"; 2 ScriptEngineManager manager = new ScriptEngineManager(); 3 ScriptEngine engine = manager.getEngineByName("jruby"

native关键字初识--java调用非java代码的接口

Java基础知识--JNI入门介绍(上) Java? 本机接口(Java Native Interface,JNI)是一个标准的 Java API,它支持将 Java 代码与使用其他编程语言编写的代码相集成.如果您希望利用已有的代码资源,那么可以使用 JNI 作为您工具包中的关键组件 -- 比如在面向服务架构(SOA)和基于云的系统中.但是,如果在使用时未注意某些事项,则 JNI 会迅速导致应用程序性能低下且不稳定. JNI 的发展JNI 自从 JDK 1.1 发行版以来一直是 Java 平台的

使用JNA,让java调用原生代码

JNA定义: JNA:java Native Access,是SUN公司开发的基于JNI的框架.JNI使得Java可以调用原生的c或者c++代码. JNA与JNI(Java Native Interface)的差别: 性能:JNA在性能上不如JNI.由于JNA是在JNI的基础上封装了一层. 移植性:JNA的可移植性要好于JNI,由于开发人员不须要再编写作为代理的动态链接库. 使用:JNI使用native关键字,使用一个个java方法映射原生方法,利用System.loadLibrary:JNA使

java中c#中statc 静态调用不同之处、c#的静态构造函数和java中的构造代码块、静态代码块

1.java和c#静态成员调用的不同之处 static 表示静态的,也就是共享资源,它是在类加载的时候就创建了 java中   可以通过实例来调用,也可以通过类名.成员名来调用,但是一般最好使用类名.成员这个方式,因为静态成员是属于类的,并不是属于具体的对象 c#中     只能通过类名.成员调用,并不能 用实例来进行调用 2.c#的静态构造函数和java中的构造代码块.静态代码块 c# 静态构造函数的特点:        1)静态构造函数不需要手动调用,系统自动调用        2)静态构造

在Java中调用C/C++代码实现

在Java中利用native关键字调用C/C++实现过程整理如下: 书写Java代码 使用javah命令编译成头文件 在codeblocks中创建SharedLibrary工程 复制头文件内容并书写实现代码 配置C工程编译环境并编译成dll文件 复制dll到Java工程目录下 执行Java程序 第一步:书写Java代码 在Eclipse中创建Java工程:JavaNativeDemo,创建包:com.xuetang9.nativedemo package com.xuetang9.natived