JNI:Java Native Interface,是Java语言提供的一种通用接口,用于Java代码与本地化代码的交互。所谓本地化代码是指直接编译成的与机器相关的二进制代码,而非Java字节码之类的中间代码。Windows下面的可执行文件,DLL等,Linux下面的可执行文件和SO文件等,都是二进制代码。JNI允许Java语言编写的程序与其他语言编写的程序库(DLL, SO)或可执行文件进行互操作,包括汇编、C、C++。
JNI的开发步骤
(1)、编写带有native方法的java类
(2)、使用javac命令编译所编写的java类
(3)、使用javah命令处理类文件,生成C/C++头文件
(4)、使用C/C++实现本地方法
(5)、将C/C++编写的文件生成动态连接库
一、建立java文件
public class testdll {
static{
System.loadLibrary("goodluck"); //goodluck不用加文件类型
}
public native int getValue();//声明本地方法
public native void setValue(int i);
/**
* @param args
*/
public static void main(String[] args) {
testdll test=new testdll();
test.setValue(10);
System.out.println(test.getValue());
}
}
说明:
1) 在JAVA程序中,首先需要在类中声明所调用的库名称System.loadLibrary( String libname );,在库的搜寻路径中定位这个库。定位库的具体操作依赖于操作系统。在windows下,首先从当前目录查找,然后再搜寻”PATH”环境变量列出的目录。如果找不到该库,则会抛出UnsatisfiedLinkError。
2) 这里加载的是JNI生成的DLL,而不是其他生成的DLL的名称。?在这里,库的扩展名字可以不用写出来,究竟是DLL还是SO,由系统自己判断。
3) 还需要对将要调用的方法做本地声明,关键字为native。并且只需要声明,而不需要具体实现。?实现放在C中实现,稍后将做说明。
4) 如果加了static,表明是静态方法。如果不加,表明是一般的方法。加与不加,生成的头文件中有一个参数不同。
二、生成头文件
javac testdll.java ----生成 testdll.class
javah testdll ----生成 testdll.h 头文件
三、建立c文件
打开c编译器,建立一个dll空工程,把testdll.h导入工程中,新建一个test.cpp源文件
在testdll.h,发现里面有两个方法:
/*
* Class: testdll
* Method: getValue
* Signature: ()I
*/
JNIEXPORT jint JNICALL Java_testdll_getValue
(JNIEnv *, jobject);
/*
* Class: testdll
* Method: setValue
* Signature: (I)V
*/
JNIEXPORT jint JNICALL Java_testdll_getValue
(JNIEnv *, jobject);
JNIEXPORT不用管,第二个单词jint/void是返回值,jint相当于int类型,JNICALL不用管,每一个方法名前都有前缀Java_testll_,前两个参数JNIEnv *和jobject不用管,第二个方法的第三个参数jint就是java文件里的int i。
上面有声明了,现在就要实现这两个方法,编写testdll.cpp文件:
#include "testdll.h"
int i=0;
JNIEXPORT jint JNICALL Java_testdll_getValue
(JNIEnv *, jobject){
return i;
}
JNIEXPORT void JNICALL Java_testdll_setValue
(JNIEnv *, jobject, jint j){
i=j;
}
四、生成动态链接库文件
此时编译会出现error,主要是提示找不到jni.h(这个包含在testdll.h)里,需要我们把jni.h、jni_md.h复制到C:\Program Files\Microsoft Visual Studio\VC98\Include这个目录里(默认安装目录,如果安装VC不是这个目录,请自行找到Include目录)。
在构建之前先作如下操作:
把jni.h、jni_md.h复制到c文件编译器安装目录的Include这个文件夹里,其中ni.h、jni_md.h文件到下面目录去找:
jni.h------------------jdk安装目录\include
jni_md.h------------jdk安装目录\include\win32
然后再编译,构建,就有了test.dll这个动态链接库文件了,把它重命名成goodluck.dll。
五、运行
有两种方法运行:
1. 将goodluck.dll文件复制到testdll.class同目录下 在控制台输入:java testdll
如果goodluck.dll文件位置没放好就会报如下错误
2. 将goodluck.dll文件复制到eclipse中项目名目录下,运行
如果goodluck.dll文件位置没放好就会报如下错误
当goodluck.dll文件位置放正确之后运行程序之后将会得到正确答案:
10
但是。。。
你会郁闷的发现,报错了!!!
不用慌,我们还需要改动几个地方:
将testdll.h 和 testdll.cpp中的两个方法:
JNIEXPORT jint JNICALL Java_testdll_getValue
JNIEXPORT jint JNICALL Java_testdll_getValue
都改为:
JNIEXPORT jint JNICALL _Java_testdll_getValue
JNIEXPORT jint JNICALL _Java_testdll_getValue
即在java前加上”_”
分享到:
相关推荐
通过这个"JNI入门Demo3.0",我们可以深入理解动态注册Native函数的概念和实现,从而在实际项目中更灵活地使用JNI。需要注意的是,动态注册虽然方便,但也需要谨慎处理,因为它可能会引入运行时错误,如方法签名不...
### JNI入门之HelloWorld(一)详解 #### 一、引言 JNI(Java Native Interface)是Java平台标准的一部分,它允许Java代码与其他语言写的代码进行交互。JNI接口提供了若干公共服务,并为Java虚拟机和本机应用程序或...
JNI(Java native interface)入门知识
### JNI入门教程详解:HelloWorld篇 #### 一、引言与背景 Java Native Interface (JNI) 是Java语言与本地代码交互的桥梁,允许Java应用调用C或C++等本地语言编写的代码,这对于扩展Java功能、提高性能或集成已有非...
### JNI入门初级教程知识点概述 本教程旨在为初学者提供JNI(Java Native Interface)的基础知识与实践指导。JNI是Java平台的一部分,它允许Java代码与其他语言编写的代码进行交互,尤其是C和C++。这对于利用现有C...
这个"Android JNI入门Demo"是一个适合初学者了解和学习JNI基础操作的实践项目。 在Android开发中,JNI的应用场景广泛,例如:提升性能的关键算法实现、调用系统库、访问硬件设备、游戏开发中的图形渲染等。下面将...
通过学习和实践这个JNI入门Demo1.0,你可以掌握JNI的基本用法,包括声明`native`方法、生成头文件、编写C++代码以及构建和加载动态库。这将为你进一步探索Android的原生开发打下基础,比如使用C++提升性能、接入第三...
本教程"JNI入门Demo2.0"将带你深入理解JNI的使用,特别是如何通过JNI反调用Java方法。 1. **JNI基础知识**: - JNI接口定义了Java虚拟机(JVM)和本地代码之间的通信规范,包括函数调用、数据类型转换、异常处理等...
### Android下JNI入门详解 #### 一、JNI与VM简介 JNI(Java Native Interface)作为Android平台上连接Java层与C/C++层的关键桥梁,在开发过程中起着至关重要的作用。通过JNI,开发人员能够实现Java与C/C++代码之间...
这篇“JNI入门教程之HelloWorld篇”文档将引导我们了解如何使用JNI来开发一个简单的应用程序。 首先,我们需要明白JNI的核心概念:本地方法接口。它提供了一种方式,让Java虚拟机(JVM)能够调用非Java语言编写的...
本教程将通过一个基础的JNI入门案例来介绍如何在Android应用中使用NDK和JNI。 首先,我们需要了解JNI的基本结构。JNI主要包含以下几个部分: 1. **本地方法声明**:在Java代码中,我们需要声明一个本地方法,这个...
JNI入门与编程实现
Java Native Interface的入门级学习demo,完美的解决了java.library.path中找不到动态库的问题,并解决了windows和linxu的兼容问题,使得这个项目打包成jar包后,能够直接在windows或Linux的java代码中调用
### JNI入门知识点详解 #### 一、JNI简介与应用场景 JNI (Java Native Interface) 是 Java 平台标准的一部分,它允许 Java 代码和其他语言写的代码进行交互。JNI 主要用于以下场景: - **性能优化**:某些算法或...
Android Studio的JNI(Java Native Interface)开发入门教程 JNI,全称为Java Native Interface,是Java平台标准的一部分,它允许Java代码和其他语言写的代码进行交互。JNI在Android开发中扮演着重要角色,尤其当...
本教程将带你入门JNI,了解如何在Java中调用C代码,以及C代码如何回调Java。 首先,我们要创建一个Java类,声明一些本地方法(native methods)。本地方法是Java方法,但其实现是在C或C++中完成的。例如: ```java...
JNI,即Java Native Interface,是Java平台的一部分,自Java 1.1开始引入,它的主要目的是为了让Java代码能够与用其他编程语言(如C和C++)编写的本地代码进行交互。虽然这种交互可能导致平台可移植性的降低,但在...