转载自http://java.chinaitlab.com/JDK/36677.html
1.简介
JNI是Java Native Interface的缩写,它的设计目的是:
The standard Java class library may not support the platform-dependent features needed by your application.
You may already have a library or application written in another programming language and you wish to make it accessible to Java applications
You may want to implement a small portion of time-critical code in a lower-level programming language, such as assembly, and then have your Java application call these functions
2.JNI的书写步骤
编写带有native声明的方法的java类
使用javac命令编译所编写的java类
使用javah ?jni java类名生成扩展名为h的头文件
使用C/C++实现本地方法
将C/C++编写的文件生成动态连接库
ok
1) 编写java程序:
这里以HelloWorld为例。
代码1:
class HelloWorld {
public native void displayHelloWorld();
static {
System.loadLibrary("hello");
}
public static void main(String[] args) {
new HelloWorld().displayHelloWorld();
}
}
声明native方法:如果你想将一个方法做为一个本地方法的话,那么你就必须声明改方法为native的,并且不能实现。其中方法的参数和返回值在后面讲述。
Load动态库:System.loadLibrary("hello");加载动态库(我们可以这样理解:我们的方法displayHelloWorld()没有实现,但是我们在下面就直接使用了,所以必须在使用之前对它进行初始化)这里一般是以static块进行加载的。同时需要注意的是System.loadLibrary();的参数“hello”是动态库的名字。
main()方法
2) 编译没有什么好说的了
javac HelloWorld.java
3) 生成扩展名为h的头文件
javah ?jni HelloWorld
头文件的内容:
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class HelloWorld */
#ifndef _Included_HelloWorld
#define _Included_HelloWorld
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: HelloWorld
* Method: displayHelloWorld
* Signature: ()V
*/
JNIEXPORT void JNICALL Java_HelloWorld_displayHelloWorld
(JNIEnv *, jobject);
#ifdef __cplusplus
}
#endif
#endif
(这里我们可以这样理解:这个h文件相当于我们在java里面的接口,这里声明了一个Java_HelloWorld_displayHelloWorld (JNIEnv *, jobject);方法,然后在我们的本地方法里面实现这个方法,也就是说我们在编写C/C++程序的时候所使用的方法名必须和这里的一致)。
4) 编写本地方法
实现和由javah命令生成的头文件里面声明的方法名相同的方法。
代码2:
1 #include <jni.h>
2 #include "HelloWorld.h"
3 #include <stdio.h>
4 JNIEXPORT void JNICALL Java_HelloWorld_displayHelloWorld(JNIEnv *env, jobject obj)
{
printf("Hello world!\n");
return;
}
注意代码2中的第1行,需要将jni.h(该文件可以在%JAVA_HOME%/include文件夹下面找到)文件引入,因为在程序中的JNIEnv、jobject等类型都是在该头文件中定义的;另外在第2行需要将HelloWorld.h头文件引入(我是这么理解的:相当于我们在编写java程序的时候,实现一个接口的话需要声明才可以,这里就是将HelloWorld.h头文件里面声明的方法加以实现。当然不一定是这样)。然后保存为HelloWorldImpl.c就ok了。
5) 生成动态库
这里以在Windows中为例,需要生成dll文件。在保存HelloWorldImpl.c文件夹下面,使用VC的编译器cl成。
cl -I%java_home%\include -I%java_home%\include\win32 -LD HelloWorldImp.c -Fehello.dll
注意:生成的dll文件名在选项-Fe后面配置,这里是hello,因为在HelloWorld.java文件中我们loadLibary的时候使用的名字是hello。当然这里修改之后那里也需要修改。另外需要将-I%java_home%\include -I%java_home%\include\win32参数加上,因为在第四步里面编写本地方法的时候引入了jni.h文件。
6) 运行程序
java HelloWorld就ok。
关于dll文件的生成以及找不到jni.h的解决办法
2008-11-08 17:07
首先是关于dll文件的生成:
方法如下:
打开VC++6.0,新建->; 工程 ->; win32 Dynamic-Link Library在向导中选择空工程
添加如用javah生成的头文件和自己写的一个cpp文件,然后编译运行,如果没有出现错误,既可以在编译成功的debug文件夹中找到dll文件,如果出现找不到jni.h的错误,那么用如下方法解决:
fatal error C1083: Cannot open include file: 'jni.h': No such file or directory
将以下文件:
\jdk\include\jni.h
\jdk\include\win32\jawt_md.h
\jdk\include\win32\jni_md.h
复制到Visual Studio.net的安装目录下的\Vc7\include目录中
如果是VC6.0,自己找相应的目录即可!
|
然后运行cl -LD HelloWorldImp.c -Fehello.dll 即可
附上自己运行的图片两张:
分享到:
相关推荐
这个“jni最简单例子,注释详细”应该是提供了一个基础的JNI学习教程,下面我们将深入探讨JNI的相关知识点。 1. **JNI概述** JNI是一种接口,使得Java应用程序可以调用本地(非Java)代码,也可以让本地代码调用...
JNI,全称Java Native Interface,是Java平台标准的一部分,它允许Java代码和其他语言写的代码进行交互。JNI在很多场景下都是必要的,比如调用操作系统API、优化性能关键部分或者利用已有的C/C++库。本DEMO将向你...
本教程将通过一个简单的例子来介绍如何使用JNI和NDK进行开发。 首先,我们需要创建一个Android项目,包含一个简单的按钮和一个TextView。按钮的作用是触发JNI函数的调用,而TextView则用来显示JNI函数返回的结果。...
这个"android上JNI最简单的学习实例hello的源代码"是一个基础的教程,用于帮助开发者理解如何在Android应用中使用JNI技术。下面将详细解释这个实例中的关键知识点。 1. **JNI的基本概念**: JNI提供了一种方式,让...
Java Native Interface(JNI)是Java平台的标准组成部分,它允许...这就是一个简单的JNI返回对象数组的例子。通过这种方式,我们可以灵活地在Java和本地代码之间传递复杂的数据结构,极大地扩展了Java应用程序的能力。
这个简单的示例对于初学者理解JNI和NDK开发至关重要,因为它展示了从创建本地方法到在Java中调用这些方法的完整过程。通过深入研究和修改这个示例,开发者可以进一步学习如何处理更复杂的任务,如使用C/C++库、处理...
本实例将深入浅出地介绍如何通过JNI调用第三方DLL库,并以最简单的整型参数传递为例,帮助初学者快速理解JNI的工作原理。 首先,我们需要创建一个Java类,声明native方法。在Java中,我们使用`native`关键字来标记...
这个简单的例子展示了JNI的基本用法,实际应用中可能涉及到更复杂的类型转换、异常处理和多线程问题,但基础原理是一样的。通过熟练掌握JNI,开发者可以在Android应用中充分利用C++的优势,提高程序性能和效率。
本例子展示了如何通过JNI在Android应用中显示一个Dialog。 首先,我们需要创建一个本地方法(native method)在Java类中声明,这个方法将在C/C++代码中实现。例如: ```java public class MainActivity extends ...
JNI(Java Native Interface)是Java平台的一个重要组成部分,它允许Java代码和其他语言写的代码进行交互。...通过理解并实践这个例子,开发者可以更好地掌握JNI的使用,为更复杂的系统集成和性能优化打下基础。
以下是一个简单的JNI和生产者-消费者模型的代码片段: ```java // Java部分 public native void produce(); public native void consume(); ``` ```c // C部分 #include "YourClassName.h" #include ...
在这个"简单的JNIdemo"中,我们将深入探讨JNI的基本概念、工作原理以及如何创建和运行一个简单的示例。 首先,我们需要理解JNI的核心功能。JNI提供了一种方式,让Java代码可以声明并调用本地方法,这些方法是由非...
这个“jni接口实现最简单案例源代码”应该是提供了一个基础的示例,帮助开发者理解如何在Java程序中使用JNI。 首先,JNI的核心概念是Java本地方法(Native Method),这是一种可以被Java虚拟机(JVM)调用的非Java...
在这个例子中,会生成一个`NativeMethod.h`,包含Java方法到C/C++函数的映射。 3. **编写C/C++代码**:根据生成的头文件,实现native方法的具体逻辑。例如: ```c++ #include "NativeMethod.h" JNIEXPORT jint ...
这篇博客将引导我们完成在Ubuntu环境下创建并运行一个简单的JNI示例。 首先,我们需要了解JNI的基本概念。JNI接口提供了Java虚拟机(JVM)与本地代码之间的桥梁。当Java程序需要执行一些只能由原生代码完成的任务时...
在这个例子中,函数简单地打印出"Hello world!"。 完成本地代码编写后,需要使用C/C++编译器(如Microsoft Visual C++)来编译源文件,生成动态链接库(如`hello.dll`)。最后,运行Java程序,`main`方法会调用`...
本篇文章将围绕Android Studio 2.2中JNI的简单使用进行详解。 首先,我们需要了解在Android Studio 2.2中如何设置JNI环境。打开项目结构设置(File > Project Structure),在模块设置(Module)中选择相应的...
在Android开发中,JNI(Java Native Interface)是一个关键的组件,它允许...通过这个简单的"Hello JNI"例子,你应该对动态注册有了初步的理解。在实际开发中,可以根据需求扩展这些基础知识,实现更复杂的本地功能。
例如,一个简单的JNI函数可能如下所示: ```cpp #include <jni.h> JNIEXPORT void JNICALL Java_com_example_MyActivity_myNativeFunction(JNIEnv *env, jobject /* this */) { // 在这里实现C/C++的代码 } ``` ...
在描述的"jni调用第三方dll最简单的实例"中,我们可能包含以下几个步骤: 1. **编写Java代码**:创建一个Java类,声明一个`native`方法,这个方法将被第三方DLL实现。例如: ```java public class NativeDemo { ...