- 浏览: 407861 次
- 性别:
- 来自: 上海
文章分类
最新评论
-
handong1587:
代码有一处错.query函数最后一行return的应该是:re ...
RMQ -
yuandong0828:
简洁的特别透彻细致,多谢,
虚函数、虚指针和虚表 -
adam_zs:
谢谢分享!
括号匹配问题 -
hongloumengyanzxw:
good[b][/b]
dup和dup2函数 -
chriszeng87:
最后第二种情况右下角的那个点是不是可以看作相交点的?上面的那种 ...
判断两个链表是否相交
我们知道Java是一种平台无关性的语言,平台对于上层的java代码来说是透明的,所以在多数时间我们是不需要调用本地方法,但是假如你遇到了以下情况,你可能就需要使用Java调用本地方法了:
- 你的Java代码需要得到一个文件的属性。但是你找遍了JDK帮助文档也找不到相关的API。
- 在本地还有一个别的系统,不过它不是Java语言实现的,这个时候你需要把两套系统整合到一起。
- 你的Java代码中需要用到某种算法,不过算法是用C实现并封装在动态链接库文件(DLL)当中的。
对于上述的三种情况,如果没有JNI的话,那就会变得异常棘手了。JNI其实是Java Native Interface的简称,也就是java本地接口。它提供了若干的API实现了和Java和其他语言的通信(主要是C&C++)。
在Java中有一些native方法,这些方法只有方法签名但是没有方法体。其实这些naive方法就是我们说的 java native interface。它提供了一个调用(invoke)的接口,然后用C或者C++去实现。
JNI概述
JVM封装了各种操作系统实际的差异性的同时,提供了JNI技术,它是一种双向的接口,使得开发者可以通过Java代码调用到各种native的库,反之亦然。所以JNI(Java Native Interface)能作为Java语言的一部分,她能够作为粘合剂将Java应用和其他本地应用(C/C++,Delphi)集合在一起。
作为一个双向的接口,JNI能支持两种native代码:native libraries 和native applications。
- 你能使用JNI去写一些native methods去允许Java Applications能呼叫native libraries中的函数,native methods的具体实现是可能C,C++或者Delphi。
- JNI也支持嵌入一个JVM实现到一个本地应用程序中去,去执行那些用Java语言编写的的模块.比如,一个C++编写的浏览器利用内嵌的JVM去执行下载到本地的applet。
实现步骤:
1) 完成Java代码,编写好Java调用类。
2) 编译你的Java类。
3) 用javah生成编译好的class文件对应的C/C++ 函数的头文件。
4) 实现头文件中的函数原型,编写native代码。
5) 将native代码编译打包成DLL库(win32)或共享库(Linux)。
6) 将你的Java代码跑起来
例子
1. 编写Java代码。
注意:
(1) 调用本地代码的java方法,要设置成native的。
(2) 要使用System的LoadLibrary方法去加载包含本地方法实现的库。
package eric.test; public class JNITest { static { System.loadLibrary("JNITest"); } public static native void sayHelloWorld(String msg); public static void main(String[] args) { sayHelloWorld("Hello, world"); } }
2. 编译生成的class文件:JNITest.class
3. 在命令行下使用javah生成C/C++头文件。在工程的bin目录下输入以下命令:
javah -classpath . -jni eric.test.JNITest
将生成头文件eric_test_JNITest.h,内容如下:
/* DO NOT EDIT THIS FILE - it is machine generated */ #include <jni.h> /* Header for class eric_test_JNITest */ #ifndef _Included_eric_test_JNITest #define _Included_eric_test_JNITest #ifdef __cplusplus extern "C" { #endif /* * Class: eric_test_JNITest * Method: sayHelloWorld * Signature: (Ljava/lang/String;)V */ JNIEXPORT void JNICALL Java_eric_test_JNITest_sayHelloWorld (JNIEnv *, jclass, jstring); #ifdef __cplusplus } #endif #endif
注意,在执行javah的时候,要输入完整的包名和类名。否则在以后的测试调用过程中会发生java.lang.UnsatisfiedLinkError这个异常。
4. 实现C++代码。在VS2008中创建一个Win32 project,类型为DLL。
将刚才生成的头文件eric_test_JNITest.h拷到工程目录下,并且在项目中导入到Header Files里面。打开StdAfx.h文件,在最后面添加:
#include "jni.h" #include "eric_test_JNITest.h"
打开JNITest.cpp文件,在其中添加实现代码。函数名为头文件中定义的函数声明。
#include <iostream> using namespace std; JNIEXPORT void JNICALL Java_eric_test_JNITest_sayHelloWorld (JNIEnv* env, jclass method, jstring param) { const char* pt = env->GetStringUTFChars(param, 0); cout << pt << " called by Java Native Interface" << endl; }
其中,GetStringUTFChars是jre中提供的jni方法,用来得到java string的字符串。
5. 构建C++项目。会出现"Cannot open include file: 'jni.h': No such file or directory"的错误,解决方法是将以下文件拷贝到C++工程目录下
- %JAVA_HOME%\include\jni.h
- %JAVA_HOME%\include\win32\jni_md.h
同时将头文件eric_test_JNITest.h中的 #include <jni.h> 改为
#include "jni.h"
然后重新build,将在debug目录下生成JNITest.dll文件。
6. 将dll文件复制到Java工程的bin目录下(这个位置十分重要,否则会出现not found的异常),并运行程序
java eric.test.JNITest
将输出结果"Hello, world called by Java Native Interface"。
发表评论
-
Java类加载器
2011-10-21 18:57 1233Java虚拟机中可以安装多 ... -
stop() 和 suspend() 方法为何不推荐使用
2011-10-21 15:39 1812反对使用stop(),是因为它不安全。它会解除由线程获取 ... -
使用阻塞缓冲区的生产者消费者
2011-10-07 19:59 1246Repository 重点在于Rep ... -
生产者消费者问题
2011-10-07 19:47 1704生产者消费者问题 生产者消费者问题是研究多线程程序 ... -
Java中从方法中返回多个值
2011-09-28 21:42 6540有些时候,我们需要从一个方法中返回多个值。那么在Java中该怎 ... -
遍历List时删除元素
2011-09-14 13:23 2417一般调用删除方法都是集合的方法,例如: List ... -
closure和callback
2011-09-12 22:24 1422闭包(closure)是一个可调用的对象,它记录了一些信息 ... -
倒排索引的简单实现
2011-09-06 20:33 12807首先看一个例子: 假设有3篇文章,file1, ... -
Java是解释型还是编译型
2011-09-01 19:58 1190Java程序需要编译,但是没有直接编译成机器语言,而是编译成. ... -
Java Socket网络编程
2011-09-01 11:34 1514在网络编程中,最基本的操作就是在两台机器之间建立点对点通信,S ... -
super.getClass()陷阱
2011-08-31 15:25 1250先给出一个问题,下面程序的输出结果是多少? impor ... -
一些java的面试题
2011-08-31 11:46 13831、一个".java"源文件中是否可以包括 ... -
Java中的文件操作
2011-08-30 22:46 1043使用Java实现一些文件操作。 import j ... -
JDK1.5中的线程池
2011-08-29 22:50 950在JDK1.5中,线程池类为 ... -
实现java线程池
2011-08-29 22:43 1362线程池的作用: 线程池作用就是限制系统中执行 ... -
java thread中的run()和start()
2011-08-29 21:28 1356当调用start()后,此线程就处于就绪状态,但并没有运行。之 ... -
嵌套类和内部类的区别
2011-08-28 21:39 18951. 内部类的对象隐含一个外部类的对象引用,可以直接引用 ... -
JVM垃圾回收机制
2011-08-28 21:12 6181. JVM的gc概述 gc即垃圾收集机制是指 ... -
new class[0]
2011-07-28 23:59 1617new Class[0]表示有零个元素的Class数组,即空数 ... -
在两台计算机上使用RMI进行远程方法调用
2011-06-20 22:05 2244RMI概述 远程方法调用就是本地对象能够调 ...
相关推荐
### Java调用C/C++全过程详解 #### 一、引言 随着软件开发技术的不断发展,跨平台的应用程序越来越受到开发者的青睐。Java作为一种典型的跨平台编程语言,因其一次编写到处运行的特点而广受欢迎。然而,Java作为一...
JAVA调用C/C++ DLL文件方法 JAVA 调用 C/C++ 库文件(DLL)是 Java 语言与 C/C++ 语言之间的交互方式之一。在 Java 中,存在多种调用 C/C++ 库文件的方式,包括 JNI、JNative、Jawin 和 Jacob 等。其中,JNI(Java ...
Java调用C/C++的过程,通常被称为JNI(Java Native Interface),是Java平台标准的一部分,它允许Java代码和其他语言写的代码进行交互。对于那些需要利用C或C++的高性能特性的Java开发者来说,JNI是一个重要的工具。...
Java 通过 JNI 调用 C/C++ 实现动态库加载 Java Native Interface (JNI) 是 Java虚拟机(JVM)提供的一种接口,允许 Java 代码和本地代码(如 C/C++)之间的交互。通过 JNI,Java 程序可以调用 C/C++ 代码,实现 ...
Java调用C/C++是跨语言编程中常见的一种技术,主要通过Java的Native Interface (JNI) 实现。JNI 是Java平台标准的一部分,它允许Java代码和其他语言写的代码进行交互,尤其是C和C++。在很多情况下,这可以利用现有的...
本教程将深入讲解如何使用JNI在Java中调用C/C++的本地库。 首先,我们需要理解JNI的基本概念。JNI提供了一套接口,让Java虚拟机(JVM)能够调用本地方法,这些方法由C或C++编写,并编译成动态链接库(如Windows下的...
总之,Java调用C/C++程序的能力通过JNI得以实现,这是一种强大的技术,使得Java应用能够充分利用本地系统的资源,同时也保留了Java的跨平台优势。虽然使用JNI会增加代码的复杂性,但其灵活性和性能提升对于许多项目...
标题中的"java写的一个使用jni调用c/c++的dll"意味着我们要创建一个Java项目,该项目包含一个或多个`native`方法,这些方法的实现将在C/C++中完成。接着,我们需要使用`javah`工具生成JNI头文件,这个头文件定义了...
Java 使用 JNA(Java Native Access)调用C/C++编写的第三方动态库(DLL文件)是一种常见的技术,它允许Java程序直接与本地操作系统接口交互,而无需编写JNI(Java Native Interface)代码。JNA 提供了一种相对简洁...
JNI开发Java和C/C++互相传递List集合, 可以参考: Java从C/C++获取List集合对象:https://blog.csdn.net/niuba123456/article/details/80994166 Java传递List集合对象到C/C++ ...
### JNI学习指南:Java调用C/C++接口详解 #### 一、引言 随着软件开发领域的不断发展,跨语言编程成为一种重要的技能。Java作为一种广泛使用的编程语言,因其跨平台特性和丰富的生态系统受到欢迎。然而,Java作为一...
总结来说,这个"JNI DEMO"是一个完整的示例,展示了如何使用Java的JNI技术来调用C/C++编写的DLL。它包括了Java代码、JNI接口的实现、DLL的编译以及Java应用的运行。对于初学者,这是一个很好的实践教程,即使没有...
JNI允许Java代码和其他语言写的代码进行交互,包括调用C/C++编译的动态链接库(DLL)文件。下面将详细介绍如何使用JNI来调用DLL,并解释相关知识点。 1. **JNI简介** JNI是Java平台的标准部分,提供了一组接口,...
本项目是一个关于Android NDK入门的实例,展示了如何混合使用Java和C/C++代码。我们将深入探讨这个主题,了解其关键概念、步骤以及实际应用。 首先,NDK的主要目的是为Android应用提供原生代码支持。原生代码通常比...
总结来说,Android调用C/C++主要涉及JNI的使用,包括本地方法声明、头文件生成、C/C++代码编写、库编译、Java调用等多个步骤。通过这个过程,开发者可以充分利用C/C++的性能优势来优化应用程序的关键部分。如果在...
首先,Java调用C/C++程序的主要技术是通过Java Native Interface (JNI)。JNI是Java平台的一部分,允许Java代码和其他语言写的代码进行交互。它为Java程序员提供了一种方式来编写本地方法,这些本地方法可以调用由C/...
2. **Java调用C/C++** - **本地方法接口**:Java代码通过`System.loadLibrary()`加载动态链接库(DLL或SO),然后通过`native`方法调用C/C++函数。 - **JNI函数注册**:C/C++代码需要使用`RegisterNatives()`函数...
它定义了一套API,让Java代码可以调用C/C++函数,反之亦然。在Android中,JNI是实现Java和C/C++交互的关键。 2. **创建NDK项目** 在Android Studio中,可以通过创建一个新的Android Studio项目,并选择包含C/C++...
这种情况下,Android的JNI(Java Native Interface)框架提供了调用C/C++代码的能力。本篇文章将深入探讨如何在Android应用中调用C/C++方法。 首先,JNI是Java平台标准的一部分,它允许Java代码和其他语言写的代码...