关于JNI我会通过自己的经历一步步告诉大家,并给大家一个案例。
一、JNI
首先大家要了解JNI是什么,可以做什么。
JNI是Java Native Interface的缩写,中文为JAVA本地调用。从Java1.1开始,Java Native Interface(JNI)标准成为java平台的一部分,它允许Java代码和其他语言写的代码进行交互。JNI一开始是为了本地已编译语言,尤其是C和C++而设计的,但是它并不妨碍你使用其他语言,只要调用约定受支持就可以了,但会丧失平台可移植性。
这样大家就知道什么是JNI,其能完成什么工作,而我就是在公司项目中需要加入人脸识别系统功能,需要调用外部接口才使用JNI的。
二、JNI案例一
开发过程中,我喜欢一步步想目标靠近,所以我的第一步选择实现简单的本地的JNI调用,最简单的当然从网上下,(见附件JavaCallDelphi.rar)。放到c盘根目录下,编译java文件,运行见效果,ok,运行成功接下来就需要自己写个简单的demo了。
三、自己实现一个demo
鉴于人脸识别为公司项目、不能公开代码,我从网上选了个比较好的例子,大家按照方法就可以实现。如下:
3.1 JAVA中所需要做的工作
在JAVA程序中,首先需要在类中声明所调用的库名称,如下:
static {
System.loadLibrary(“goodluck”);
}
在这里,库的扩展名字可以不用写出来,究竟是DLL还是SO,由系统自己判断。
还需要对将要调用的方法做本地声明,关键字为native。并且只需要声明,而不需要具体实现。如下:
public native static void set(int i);
public native static int get();
然后编译该JAVA程序文件,生成CLASS,再用JAVAH命令,JNI就会生成C/C++的头文件。
例如程序testdll.java,内容为:
public class testdll
{
static
{
System.loadLibrary("goodluck");
}
public native static int get();
public native static void set(int i);
public static void main(String[] args)
{
testdll test = new testdll();
test.set(10);
System.out.println(test.get());
}
}
用javac testdll.java编译它,会生成testdll.class。
再用javah testdll,则会在当前目录下生成testdll.h文件,这个文件需要被C/C++程序调用来生成所需的库文件。
3.2 C/C++中所需要做的工作
对于已生成的.h头文件,C/C++所需要做的,就是把它的各个方法具体的实现。然后编译连接成库文件即可。再把库文件拷贝到JAVA程序的路径下面,就可以用JAVA调用C/C++所实现的功能了。
用VC++6.0创建dll文件:
<1>msdev->new->project->win32 Dynamic-Link Library
<2>Enter project name (e.g. VCdll)
<3>choose "An empty DLL project"->finish
<4>将3生成的TestNative.h和jdk下的jni.h和jni_md.h加入到工程中去
<5>Create a c++ file, implements the native method. as follows:
接上例子。我们先看一下testdll.h文件的内容:
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class testdll */
#ifndef _Included_testdll
#define _Included_testdll
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: testdll
* Method: get
* Signature: ()I
*/
JNIEXPORT jint JNICALL Java_testdll_get
(JNIEnv *, jclass);
/*
* Class: testdll
* Method: set
* Signature: (I)V
*/
JNIEXPORT void JNICALL Java_testdll_set
(JNIEnv *, jclass, jint);
#ifdef __cplusplus
}
#endif
#endif
在具体实现的时候,我们只关心两个函数原型
JNIEXPORT jint JNICALL Java_testdll_get (JNIEnv *, jclass);
和
JNIEXPORT void JNICALL Java_testdll_set (JNIEnv *, jclass, jint);
这里JNIEXPORT和JNICALL都是JNI的关键字,表示此函数是要被JNI调用的。而jint是以JNI为中介使JAVA的int类型与本地的int沟通的一种类型,我们可以视而不见,就当做int使用。函数的名称是JAVA_再加上java程序的package路径再加函数名组成的。参数中,我们也只需要关心在JAVA程序中存在的参数,至于JNIEnv*和jclass我们一般没有必要去碰它。
好,下面我们用testdll.cpp文件具体实现这两个函数:
#include "testdll.h"
int i = 0;
JNIEXPORT jint JNICALL Java_testdll_get (JNIEnv *, jclass)
{
return i;
}
JNIEXPORT void JNICALL Java_testdll_set (JNIEnv *, jclass, jint j)
{
i = j;
}
编译连接成库文件,本例是在WINDOWS下做的,生成的是DLL文件。并且名称要与JAVA中需要调用的一致,这里就是goodluck.dll
注意:在这里面需要注意几个地方
A 其中的jni.h通常在 jdk\include\ 可以先拷贝到VC安装目录下的include目录下.一劳永逸,以后可以方便使用JNI技术.
B 全部的数据类型需要考虑Java和VC的接口问题.用jint jstring 等.
C 函数名称和自动生成的.h文件中规定的一致.命名规则是: Java_使用类_方法名
这样JNI简单的基本完成,接下来我会介绍如何在web工程里加入JNI的dll调用
分享到:
相关推荐
在Android开发中,JNI通常用于实现性能敏感的代码、调用系统库或者利用已有的C/C++库。本案例将详细介绍如何在Android项目中使用JNI。 1. **JNI基础知识** JNI提供了一种方式,让Java代码可以调用本地(Native)...
Android Studio JNI开发是Android应用程序开发中的一个重要组成部分,它允许开发者使用C++或其他本地语言编写部分代码,以实现高性能计算、利用硬件加速或者调用已有的C/C++库。JNI(Java Native Interface)是Java...
Android上的JNI实现主要涉及到Android应用开发中的本地化编程技术,JNI(Java Native Interface)是Java平台提供的一种标准接口,允许Java代码和其他语言写的代码进行交互。这个案例是为初学者设计的,旨在帮助理解...
本教程将通过一个基础的JNI入门案例来介绍如何在Android应用中使用NDK和JNI。 首先,我们需要了解JNI的基本结构。JNI主要包含以下几个部分: 1. **本地方法声明**:在Java代码中,我们需要声明一个本地方法,这个...
1. **JNI基础**:理解JNI的基本结构,包括如何定义本地方法(`JNIEXPORT`和`JNIEXPORT`关键字),如何在Java代码中声明本地方法,并在C/C++代码中实现它们。 2. **头文件生成**:使用`javah`命令或者Android Studio...
这个“通过JNI实现图像处理的demo”是一个实战案例,展示了如何使用JNI来进行图像处理,特别是图像的灰度化操作。图像处理是计算机视觉领域的一个基本任务,灰度化则是将彩色图像转换为单色图像的过程,简化了图像...
本JNIDemo案例将深入讲解如何在Java程序中使用JNI技术。 首先,我们来理解JNI的基本概念。JNI提供了一套接口,使得Java代码可以调用本地(native)代码,同时本地代码也能调用Java的方法。这种交互方式分为两个主要...
这个案例可能演示了如何在Android应用中使用JNI和NDK实现MRSA加密解密功能。 总结来说,这个案例提供了一个实践Android JNI和NDK结合使用的实例,通过这个案例,开发者可以学习到如何在Android应用中嵌入C/C++代码...
以下是对JNI开发案例及关键代码的详细解释。 1. JNI开发背景介绍 - **什么是JNI**:JNI是一种接口,允许Java代码和其他语言写的代码进行交互。它提供了一组API,使得Java程序员可以编写本地方法,这些方法可以在...
在本案例中,“用JNI技术实现加减乘除算法”意味着我们将探讨如何利用JNI来编写和调用本地方法来执行基本的算术运算。 首先,我们需要理解JNI的工作原理。JNI接口定义了一系列的函数,这些函数允许Java虚拟机(JVM...
这个“jni接口实现最简单案例源代码”应该是提供了一个基础的示例,帮助开发者理解如何在Java程序中使用JNI。 首先,JNI的核心概念是Java本地方法(Native Method),这是一种可以被Java虚拟机(JVM)调用的非Java...
本案例"Android使用JNI"将深入探讨如何在Android应用中有效地运用JNI技术。 首先,JNI的核心概念是本地方法接口,它为Java虚拟机(JVM)提供了一个桥梁,使得Java代码能够调用本地(native)代码,反之亦然。要使用...
3. 实现本地方法:在生成的C/C++源文件中,实现这些本地方法。 4. 配置Android.mk或CMakeLists.txt:为本地方法构建过程配置编译规则。 5. 编译链接库:使用NDK编译C/C++源文件,生成.so动态链接库。 6. 在Android...
在JNI中,我们可以编写C/C++代码来扩展Java应用程序,实现一些Java无法直接完成的功能,比如访问操作系统底层服务或者调用已有的C库。本示例主要探讨如何在JNI中创建并返回一个对象数组到Java层。 首先,我们需要...
这份“JNI自学手册+案例”应该包含了一些关于如何使用JNI的基本概念、API讲解以及实战应用。 首先,JNI的核心是为Java程序员提供了一种方式来编写本地方法(Native Method),这些方法可以使用非Java语言(如C++或C...
在某些情况下,你可能需要通过AIDL在Java层调用一个使用JNI实现的函数。例如,服务端通过AIDL暴露一个接口,而这个接口的方法在JNI中实现,以利用C/C++的性能优势。客户端通过调用AIDL接口,间接地触发JNI中的操作。...
- 通过JNI实现必要的桥梁函数,以便Java代码可以调用C/C++函数,反之亦然。 - 在游戏逻辑中混合使用Java和C/C++代码。 #### 六、结论 JNI作为一种重要的跨语言通信工具,为Java开发者提供了强大的扩展能力和性能...
标题中的"TTS+JNI (delphi)案例"指的是一个使用Delphi编程语言创建的动态链接库(DLL),该库被设计用于与Java应用程序交互,实现文本到语音(TTS)的功能,并能将朗读的音频转换为WAV格式。这个案例提供完整的源...
在本案例中,JNI被用来连接OPC(OLE for Process Control)服务器,这是一种工业自动化领域的标准接口,用于不同设备和系统之间的数据交换。 OPC服务器是一个中间件,它提供了与工业控制系统设备通信的标准接口。...