`
zhoucl
  • 浏览: 50053 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Java中JNI的使用(一)——native

    博客分类:
  • Java
阅读更多

Java接触有一阵时间了,一直听说过JNI(Java Native Interface,Java本地接口),以我的理解是Java程序中调用C/C++等等语言编写的动态库之类的方法,具体机制还不是特别清楚,一直也没有用过。最近没事的时候查看了下JDK的源码,发现里面有很多native关键字,于是乎,趁今天没事,就花了下时间来弄个简单的实验,仅仅是通过Java调用C/C++产生的dll动态链接库里面的函数,对于C/C++中使用Java中的类型等,则下一次再深入去研究研究。在这就把所作实验的过程做下记录,以备以后查询所用。

1、工具:

===MyEclipse 8.6                 编写Java类

===eclipse-cpp-helios-SR2    产生C/C++的Dll文件

===JDK1.6

2、通过JNI调用本地方法的步骤如下:

2.1、编写调用本地接口的Java类:JNICAller.java

package org.clzps;

public class JNICaller {
	static {
		System.loadLibrary("libTestJNI");
	}
	
	public JNICaller() {}
	
	public native void print();
	
	public native int Add(int a, int b);
}

2.2、通过jdk里面的工具javah产生对应的C/C++头文件.h,命令如下:

javah -jni org.clzps.JNICaller

2.3、在目录下则会产生如下所示的类似文件:org_clzps_JNICaller.h

2.4、启动eclipse-cpp-helios-SR2(关于eclipse-cpp-helios-SR2配置这里不做描述),并且新建一个C Project类型的Shared Library类型的项目,如下图所示:

复制org_clzps_JNICaller.h至新建的项目当中,根据org_clzps_JNICaller.h文件新建对应的org_clzps_JNICaller.c源文件,如下所示:

/*
 * org_clzps_JNICaller.c
 *
 *  Created on: 2011-6-20
 *      Author: Administrator
 */
#include <jni.h>
#include "org_clzps_JNICaller.h"
#include <stdio.h>

/*
 * Class:     org_clzps_JNICaller
 * Method:    print
 * Signature: ()V
 */
JNIEXPORT void JNICALL _Java_org_clzps_JNICaller_print
  (JNIEnv *env, jobject jobj) {
	printf("Welcome to JNI's World!");
}

/*
 * Class:     org_clzps_JNICaller
 * Method:    Add
 * Signature: (II)I
 */
JNIEXPORT jint JNICALL _Java_org_clzps_JNICaller_Add
  (JNIEnv *env, jobject jobj, jint a, jint b) {
	int sum = 0;
	sum = a + b;
	return sum;
}

在Project-->Properties-->C/C++ General-->Paths and Symbols的Includes里面添加jvm.h等相关的头文件,如下图所示:



 并且选择顶部Configuration为Release Active,然后Build Project,如果不出错将产生需要的libTestJNI.dll文件,供Java调用;

2.5、将libTestJNI.dll拷贝至System.getProperty("java.library.path")的路径中,关于这个路径请参考其他的资料;

2.6、编写测试JNICaller类得单元测试:

package org.clzps;

import junit.framework.TestCase;

public class TestJNICaller extends TestCase {
	public void testCase() {
		JNICaller caller = new JNICaller();
		caller.print();
		assertEquals(30, caller.Add(10, 20));
	}
}

2.7,通过mvn test进行测试,出现正确的结果:


 

3、至此、Java已经通过native成功调用了C/C++编写的动态链接库.dll

 

  • 大小: 51.7 KB
  • 大小: 124.8 KB
  • 大小: 68.5 KB
0
0
分享到:
评论

相关推荐

    JNI开发实例——锅炉压力监控器的源码

    在这个"JNI开发实例——锅炉压力监控器的源码"中,我们将深入探讨如何使用JNI来开发一个实时监控锅炉压力的系统。这个系统可能是为了确保工业生产过程中的安全性和效率,通过硬件接口获取实时数据,并在Java应用程序...

    jni例子——使用int数组

    在这个“jni例子——使用int数组”的示例中,我们将深入探讨如何在Java和C/C++之间传递和操作int数组。 1. **JNI基础知识**: - JNI接口提供了Java与本地代码(如C/C++)通信的桥梁,使得开发者可以在Java应用中...

    JNI开发——不同class类中的native本地方法的动态注册

    在传统的JNI开发中,我们通常在Java类中声明`native`方法,然后在对应的`.c`或`.cpp`文件中使用`JNIEXPORT`和`JNICALL`宏定义来实现这些方法。然而,当有大量类需要添加本地方法时,这种静态注册方式会变得繁琐且...

    JAVA学习笔记————————

    9. **JNI(Java Native Interface)**:当JAVA代码需要调用本地(C/C++)代码时,JNI提供了桥梁,学习笔记会介绍如何使用JNI进行跨语言交互。 10. **JAVA标准库**:包括JDBC(数据库连接)、Swing(GUI开发)、JAXP...

    Java JNI调用IC卡读卡器

    Java JNI(Java Native Interface)是Java平台标准的一部分,它允许Java代码和其他语言写的代码进行交互。JNI在很多情况下被用来调用本地库,比如C、C++编写的库,这在处理特定硬件设备或者高性能计算时非常有用。在...

    JNI编程(二) —— 让C++和Java相互调用(2)

    JNI,全称Java Native Interface,是Java平台标准的一部分,它允许Java代码和其他语言写的代码进行交互。这篇博客“JNI编程(二) —— 让C++和Java相互调用(2)”显然深入探讨了如何利用JNI实现Java与C++之间的互调用...

    在Android中的jni里使用OpenGL ES和OpenCV渲染一幅图片

    在Android平台上,JNI(Java Native Interface)允许开发者使用C++代码来增强应用程序的功能,尤其是在处理图形和计算密集型任务时,如使用OpenGL ES和OpenCV。这个特定的项目旨在通过JNI调用来结合这两个强大的库...

    JNI学习示例代码,含java代码工程和win32 dll工程

    JNI,全称为Java Native Interface,即Java本地接口,JNI是Java调用Native 语言的一种特性。通过JNI可以使得Java与C/C++机型交互。即可以在Java代码中调用C/C++等语言的代码或者在C/C++代码中调用Java代码。由于JNI...

    java通过JNI调用dll的事例 附说明

    本教程将深入讲解如何使用Java通过JNI来调用DLL,并提供一个具体的实例——调用MessageBox函数。 首先,理解JNI的概念是至关重要的。JNI是Java平台标准的一部分,它为Java程序员提供了一种安全、高效的方式来调用...

    java调用C语言编写的so库中的函数,java调用C语言编写的dll库中的函数

    Java可以通过JNI(Java Native Interface)或者第三方库如JNA(Java Native Access)来实现这一功能。本文将深入探讨这两种方法,以及如何在Java中调用C语言编写的SO(Linux下的动态链接库)和DLL(Windows下的动态...

    JNI调用及回调就(Java&C) 源码

    JNI,全称Java Native Interface,是Java平台标准的一部分,它允许Java代码和其他语言写的代码进行交互。JNI在很多场景下都是必要的,比如当Java需要利用特定的系统功能,或者需要与已有的C/C++库集成时。在这个场景...

    Java JDK 6学习笔记——ppt简体版

    15. **JNI(Java Native Interface)**:Java的本地接口允许Java代码调用C/C++的库,实现性能优化或调用特定平台的功能。 Java JDK 6学习笔记——PPT简体版将详细解析以上知识点,通过实例演示和清晰的讲解,帮助...

    深入java虚拟机(一)——java虚拟机底层结构详解1

    方法区存储类信息、常量、静态变量等,而直接内存则用来优化Java程序对非Java内存的访问,如JNI(Java Native Interface)的使用。 理解JVM的底层结构对于Java开发者来说非常重要,因为它有助于优化代码性能,比如...

    JNI攻略之十一――启动虚拟机调用java类

    标题与描述均指向了一个具体的技术主题——通过JNI(Java Native Interface)在C语言环境中启动Java虚拟机并调用Java类。这一技术应用广泛,尤其是在需要跨语言编程或利用Java的特性(如垃圾回收、多线程)而底层...

    JNI的两个头文件jni.h和jni_md.h

    JNI,全称Java Native Interface,是Java平台标准的一部分,它允许Java代码和其他语言写的代码进行交互。JNI在很多场景下都是必要的,比如调用操作系统本地库、加速性能关键的代码或者利用硬件特性等。本文将深入...

    jsp,java中文乱码问题另类解决方案,jni加密、解密编码

    本篇文章将深入探讨这个问题,并提出一种另类的解决方案——利用JNI(Java Native Interface)进行加密和解密操作来规避乱码问题。 首先,我们需要理解为什么会出现中文乱码。这通常与字符编码有关,Java和JSP默认...

    JNI攻略之一――建立一个简单的JNI程序

    ### JNI攻略之一——建立一个简单的JNI程序:详细解析 #### 一、理解JNI与跨语言编程 JNI(Java Native Interface)是Java平台标准的一部分,它允许Java代码与其他语言(如C/C++)编写的代码进行交互。这在需要高...

Global site tag (gtag.js) - Google Analytics