- 浏览: 620451 次
- 性别:
- 来自: 北京
最新评论
-
fly雪域清风:
解决Ice.MessageSizeMax限制异常 -
zbw_ly:
000000
"XX cannot be resolved to a type "eclipse报错及解决说明 -
376174502:
您好,我的是java的 我按您的方法 “3,基于& ...
解决Ice.MessageSizeMax限制异常 -
ipenglei:
优先级的区别 :
puts true and false ...
ruby的逻辑运算符and与&& -
xyc717:
我弄出来了,但是有个问题想问问,为啥他拦截什么方法都要报错,比 ...
Spring3.1异常通知ThrowsAdvice说明
引言:
JNI,java本地接口。介绍跳过,搜索“JNI”有好大一票记录。网上例子灰常多,差不多只有3,4版的样子,而且不容易按文章的说明自行实现。因此本文,专门就调通一个流行的简单实例进行全程解说。
正文:
(家里电脑无环境,占楼,待续。)
(续上)
本例中,java侧为手工编写,以突出要点。C++侧的dll采用VS2010的win32_dll,以求简洁。
一、概要。
完成此JniDemo大体需要以下几步:
1,编写Java类;
2,编译为*.class文件;
3,编译出JNI头文件;
4,编写C++的dll;
5,部署dll运行*.class。
以下就每一步进行详细说明。
二、详细说明。
1,编写Java类。 需要注意的是确认本机JDK安装成功。另外为了突出重点,类不带包声明,以避免“找不到类”这类报错的干扰。代码如下:
import java.io.Serializable; /* * Copyright (c) 2010 CCX(China) Co.,Ltd. All Rights Reserved. * * This software is the confidential and proprietary information of * CCX(China) Co.,Ltd. ("Confidential Information"). * It may not be copied or reproduced in any manner without the * express written permission of CCX(China) Co.,Ltd. * * Author: zhnb * Date: 2011-6-20 下午04:50:43 */ public class JniHello implements Serializable { private static final long serialVersionUID = 2683028985839110062L; // JNI调用 public native void sayHi(); static { System.loadLibrary("jniWin32"); } // 自定义方法 public void sayHi(String str){ System.out.println("Hello, " + str + " !"); } public static void main(String[] args) { JniHello jniHello = new JniHello(); jniHello.sayHi(); jniHello.sayHi("Zhao"); } }
以上代码没有啥解释的,文件名“JniHello.java”(笔者工作目录“E:\tecPoints\jni\”)。
2,编译为*.class文件。
A)“开始” | “运行” (或【窗口】+【R】组合键),输入
cmd
打开DOS命令窗口。
B)执行:
$E: $cd E:\tecPoints\jni $javac JniHello.java
其中“$”指代DOS命令提示符(比如“E:\tecPoints\jni>”)。此时工作目录(E:\tecPoints\jni\)生成一个文件“JniHello.class”。
3,编译出JNI头文件。
运行:
$javah -jni JniHello
此时在工作目录生成一个文件“JniHello.h”。为编写C++的dll而生成。目前工作目录下,共有3个文件,如图“files_in_workdir.jpg”。
4,编写C++的dll。
A)打开VS2010(笔者使用的旗舰版)。
B)操作“ 文件 | 新建 | 项目... ”,在左侧选择“ Visual C++ | win32 ” ,主栏中选择“win32 项目”。下边“名称”填入“jniWin32”,点确定。如图“create_win32DLL_project.jpg”。
在win32向导中,选择“Dll”。如图“create_win32DLL_project_asDLL.jpg”所示。
点击“完成”,即生成jniWin32项目。如图“jniWin32_project_fileView.jpg”所示。
此时,C++ DLL项目创建完成。
C)编写DLL。
(i)操作:右键项目“jniWin32” | 选择“在windows 资源管理器中打开文件夹”。然后从java工作目录将“JniHello.h”拷入刚打开的jniWin32工作目录。
(ii)操作:右键“头文件” | 添加... | 现有项...。选择jniWin32工作目录的“JniHello.h”。
注:此时可能出现问题“#include <jni.h>” 找不到jni.h的引用。解决方法,将jdk安装目录下的include文件夹中的“jni.h”,及当前文件夹下win32文件夹中“jni_md.h”、“jawt_md.h”,共3个文件,拷入VS2010安装目录下的“/VC/include/”文件夹中。
(iii)编辑:
a)打开“stdafx.h”文件,在末尾添加如下代码:
// ... ... // TODO: 在此处引用程序需要的其他头文件 #include <jni.h> #include "JniHello.h"
b),从“JniHello.h”中复制方法签名到“jniWin32.cpp”文件正文,并编写实现。如下所示。
// jniWin32.cpp : 定义 DLL 应用程序的导出函数。 // #include "stdafx.h" // 以下为正文 JNIEXPORT void JNICALL Java_JniHello_sayHi(JNIEnv *, jobject){ // 具体实现 printf("Hello !"); };
(ix)编译生成DLL。
操作:“ 生成 | 编译 ” 或“【Ctrl】+【F7】”(注意要选中“jniWin32.cpp”文件,否则可能看不到“编译”菜单)。 成功后,会在C++侧的jniWin32工作目录(可能不同级有两个,看顶层的目录)中的Debug下看到jniWin32.dll文件。如下图所示:
此时DLL制作完成。
5,部署dll运行*.class。
A)部署。将此DLL文件拷至Java的*.class(IDE下)同一目录下。
注:若报异常:
java.lang.UnsatisfiedLinkError: no XXX in java.library.path
即“找不到XXX在库路径下”,则需要将生成的DLL拷至系统可检测的PATH路径中。可检测PATH路径可由以下Java语句获得:
/** * 获取系统PATH */ public class GetSysPath { public static void main(String[] args) { // 类路径 String str = System.getProperty("java.library.path"); System.out.println(str); } }
如笔者执行后的结果为(为方便阅读已格式化处理):
C:\Program Files\Java\jre6\bin . C:\WINDOWS\Sun\Java\bin C:\WINDOWS\system32 C:\WINDOWS C:/Program Files/Java/jre6/bin D:\kits\TortoiseSVN\bin D:\kits\MySQL\bin C:\Program Files\Microsoft SQL Server\100\Tools\Binn\ E:\tecPoints\JAVA_PATH C:\Program Files\Java\jdk1.6.0_18\bin D:\kits\apache-ant-1.8.2\bin D:\database\instantclient_11_2 D:\kits\maven3\bin D:\kits\ice\ZeroC\Ice-3.4.1\bin
注:为了方便管理,推荐一下笔者的做法。在上面库路径列表中,第10行“E:\tecPoints\JAVA_PATH”,为笔者在系统变量的“PATH”中添加的一个路径,专门用于存放打包、测试库等元件。只要将jniWin32.dll拷入此目录,即可被“System.loadLibrary("jniWin32")”查找到。
B)执行*.class。
运行:
$java JniHello
显示结果:
E:\tecPoints\jni>java JniHello Hello !Hello, Zhao ! E:\tecPoints\jni>
其中,第2行第一个“Hello !”为DLL打印。
结语:
JNI原理很简单,从正文“一、概要”中可以一目了然。问题主要集中在DEMO部署上。
老规矩,代码尾随。见《Java JNI之C++DLL实现.rar》
- Java_JNI之C__DLL实现.rar (9.7 MB)
- 下载次数: 267
评论
发表评论
-
js手工实现富文本编辑器原理
2012-10-12 17:18 10415引言 最近做了个手工给讨论打分的小工具,想标注出关键词句 ... -
java实现监视文件修改变更
2012-07-13 14:22 2635引言: 刚开始看jforum的源代码,感觉其中的File ... -
android连接webapp发送接收消息最简实现
2012-07-12 16:58 2264引言: android群有朋友要实现“android ... -
java运行dos命令方法及不立即执行的解决
2012-06-06 15:37 6269引言: 最近两次被网友问到,关于java运行dos命令 ... -
Java 静态成员变量与静态块初始化的一个问题
2012-04-28 14:28 0引言: 今天工作早早搞完,闲得蛋疼,顺手清洁单元测试的时 ... -
查找文件中字符串(正则表达式实现)
2012-04-09 16:49 2711引言: 今天群友问到一个查找文件流中广播IP的问题, ... -
String.contains(null)留神了
2012-03-06 16:07 3505引言: 今天同事发现我封装的SQL分离,有个很2B的异常 ... -
dom4j-1.6.1和他的完整依赖包们
2011-12-07 10:33 13825引言: 今天做spring实验环境的时候,遇到NoCla ... -
java判定数组或集合是否存在某个元素
2011-11-30 11:31 33454引言: 今天群里有朋友问“怎么知道一个数组集合是否已经存 ... -
myeclipse添加的struts2在搜索namespace时并不逐级查找
2011-11-28 19:35 2175引言: 今天用myeclipse想写个demo给网友自己 ... -
java web project的web.xml配置之——错误页(errorpage)
2011-11-28 11:06 14361引言: 在java web ... -
Ice服务端使用slf4j-log4j日志文件权限问题的解决
2011-09-29 16:48 9436引言: 公司内部小系统原始后台使用java-log4j来 ... -
eclipse常用设置
2011-09-29 16:19 2283引言: 前些天在家 ... -
Ice交流占楼篇
2011-09-29 15:47 1406引言: 经过这一个月的民工作业,ICE基本坦途了,公 ... -
Ice安装_rhel5
2011-09-16 09:22 2522引言: 上回提到ice ... -
Ice使用_运行demoj_gridbox
2011-09-08 09:45 5503引言: 本篇以图文方式演示如何跑通官方安装包自带的Gri ... -
Ice安装_WinXP
2011-09-08 09:07 2990引言: 本篇只讲述在WinXP系统下的安装,linux将选 ... -
Ice实战系列总目录
2011-09-08 09:00 3514引言: 调整项目忙了半个月,又啃了一段时间ICE基本 ... -
java接口内定义抽象方法
2011-08-30 10:29 5008引言: 写接口的时候,因为给方法改名的时候打了个空格 ... -
Spring3.1异常通知ThrowsAdvice说明
2011-08-30 09:46 5312引言: 笔者直接从Spring2.x跳到Spring ...
相关推荐
JNI 调用实例(Java、C++ 互相调用实例) 本文旨在介绍 Java 和 C++ 之间的互相调用实例,通过 JNI(Java Native Interface)技术,实现 Java 调用 C++ 和 C++ 调用 Java 的操作。下面将对标题、描述、标签和部分...
本资源提供的“java jni简单实例”是一个实际应用JNI的示例,有助于学习和理解JNI的工作原理。 首先,我们来看JNI的核心概念: 1. **本地方法接口**:JNI定义了一套接口,使得Java代码能够声明本地方法(即非Java...
这个实例不仅展示了如何调用C++ DLL,还可能包含了一些关于如何处理Java对象、数组、字符串等的示例,这些都是JNI编程中常见的操作。通过深入研究这个实例,开发者可以更好地理解和掌握JNI的使用,以便在未来的工作...
在这个"Java jni调用c实例"中,我们将深入探讨如何通过JNI在Java应用程序中调用C语言编写的函数。 首先,我们需要了解JNI的基本结构。一个典型的JNI程序包括Java源代码、C/C++源代码以及对应的头文件。Java源代码中...
Android C、Java、JNI效率测试结果分析 Android 操作系统中,效率测试是一个非常重要的方面,特别是在使用 JNI(Java Native Interface)调用 C 语言时。这个文档描述了 Android G1 环境中,C、Java、JNI 调用(C ...
在《Java_JNI_获得系统进程信息实例.doc》中,我们探索了一个利用Java Native Interface (JNI)来获取操作系统进程信息的示例项目。该项目由三个主要部分组成:`systemProcess.java`,`dataProcess.java`以及`process...
在这个“GMSSL的java调用(JNI库和调用实例).zip”压缩包中,我们主要探讨如何在Java环境中通过JNI(Java Native Interface)来调用GMSSL库,以便利用这些国密算法进行数据加解密和哈希运算。 首先,我们需要了解...
Java通过JNI调用C# DLL是一个跨平台、跨语言的技术实践,主要应用于需要利用Java的稳定性和C#的高性能场景。JNI(Java Native Interface)是Java平台标准的一部分,它允许Java代码和其他语言写的代码进行交互。C# ...
总结来说,这个实例展示了Java通过JNI调用C++本地方法的基本流程,包括Java端的声明、JNI头文件的生成、C++的实现、动态链接库的编译以及最终的调用。虽然这个实例没有涉及复杂的类型转换,但在实际应用中,根据数据...
JNI(Java Native Interface)是Java平台的一个重要特性,它允许Java代码和其他语言写的代码进行交互。在Android开发中,NDK(Native Development Kit)提供了一种使用C、C++编写原生代码的方式,通过JNI来实现Java...
Android NDK JNI 经典实例Android NDK JNI 经典实例Android NDK JNI 经典实例Android NDK JNI 经典实例Android NDK JNI 经典实例Android NDK JNI 经典实例Android NDK JNI 经典实例
Java通过JNI调用DLL动态库,亲测试编写
在本实例中,我们将深入探讨如何使用纯C语言通过JNI调用Java对象的方法。这个例子特别适合那些需要利用C/C++的高效性能,同时又需要与Java应用程序集成的开发者。 首先,我们需要理解JNI的基本概念。JNI提供了一套...
完整的实现java跨平台调用C程序源码,包含JAVA源码和C源码以及编译后的demo dll。将dll放到jdk bin目录下,java 项目可以直接运行。若要修改dll可以,修改C源码后重新编译生成dll。该demo处理了多线程调用c,全局...
在Android开发中,JNI(Java Native Interface)是一个关键的组件,它允许Java代码与其他语言编写的代码进行交互,特别是C和C++。本教程将深入探讨如何在Android应用中使用JNI进行跨语言通信,以实现特定功能或提高...
Java高级JNI教程主要探讨了Java Native Interface(JNI)这一技术,它是Java平台中用于与本地代码交互的重要工具。JNI允许Java程序调用C/C++编写的库,反之亦然,从而实现了Java应用与操作系统底层功能的深度融合。...
Java的JNI(Java Native Interface)本地方法是一种技术,允许Java代码与用其他编程语言(如C和C++)编写的本地代码进行交互。自从Java 1.1开始,JNI已经成为Java平台的一个重要组成部分,它的主要目标是保持平台的可...
JAVA使用JNI读写INI文件的实例。 JAVA本身并没有读写INI文件的现成方法,有些人自己编写方法来读写INI文件,但是这样的方法或多或少的存在着一些问题。此示例旨在利用本地的WIN32API函数来读写INI文件,这样可以保证...
在本实例中,我们将探讨如何使用Eclipse集成开发环境来创建一个简单的JNI项目,实现C语言与Java之间的字符串传递。 首先,我们需要了解JNI的基本概念。JNI提供了一种方式,使得Java应用程序能够调用本地(非Java)...