`
liweitsky
  • 浏览: 45035 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

JNI实现案例

    博客分类:
  • JNI
阅读更多
关于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调用
0
3
分享到:
评论

相关推荐

    JNI 完整的案例

    在Android开发中,JNI通常用于实现性能敏感的代码、调用系统库或者利用已有的C/C++库。本案例将详细介绍如何在Android项目中使用JNI。 1. **JNI基础知识** JNI提供了一种方式,让Java代码可以调用本地(Native)...

    android studio jni开发 案例代码

    Android Studio JNI开发是Android应用程序开发中的一个重要组成部分,它允许开发者使用C++或其他本地语言编写部分代码,以实现高性能计算、利用硬件加速或者调用已有的C/C++库。JNI(Java Native Interface)是Java...

    android上jni实现

    Android上的JNI实现主要涉及到Android应用开发中的本地化编程技术,JNI(Java Native Interface)是Java平台提供的一种标准接口,允许Java代码和其他语言写的代码进行交互。这个案例是为初学者设计的,旨在帮助理解...

    NDK基础之JNI入门案例

    本教程将通过一个基础的JNI入门案例来介绍如何在Android应用中使用NDK和JNI。 首先,我们需要了解JNI的基本结构。JNI主要包含以下几个部分: 1. **本地方法声明**:在Java代码中,我们需要声明一个本地方法,这个...

    android NDK-JNI开发案例

    1. **JNI基础**:理解JNI的基本结构,包括如何定义本地方法(`JNIEXPORT`和`JNIEXPORT`关键字),如何在Java代码中声明本地方法,并在C/C++代码中实现它们。 2. **头文件生成**:使用`javah`命令或者Android Studio...

    通过jni实现图像处理的demo

    这个“通过JNI实现图像处理的demo”是一个实战案例,展示了如何使用JNI来进行图像处理,特别是图像的灰度化操作。图像处理是计算机视觉领域的一个基本任务,灰度化则是将彩色图像转换为单色图像的过程,简化了图像...

    JNIDemo案例

    本JNIDemo案例将深入讲解如何在Java程序中使用JNI技术。 首先,我们来理解JNI的基本概念。JNI提供了一套接口,使得Java代码可以调用本地(native)代码,同时本地代码也能调用Java的方法。这种交互方式分为两个主要...

    android jni和NDK简单案例(.so库调用)

    这个案例可能演示了如何在Android应用中使用JNI和NDK实现MRSA加密解密功能。 总结来说,这个案例提供了一个实践Android JNI和NDK结合使用的实例,通过这个案例,开发者可以学习到如何在Android应用中嵌入C/C++代码...

    jni开发案例总结及关键代码.docx

    以下是对JNI开发案例及关键代码的详细解释。 1. JNI开发背景介绍 - **什么是JNI**:JNI是一种接口,允许Java代码和其他语言写的代码进行交互。它提供了一组API,使得Java程序员可以编写本地方法,这些方法可以在...

    用JNI技术实现加减乘除算法

    在本案例中,“用JNI技术实现加减乘除算法”意味着我们将探讨如何利用JNI来编写和调用本地方法来执行基本的算术运算。 首先,我们需要理解JNI的工作原理。JNI接口定义了一系列的函数,这些函数允许Java虚拟机(JVM...

    jni接口实现最简单案例源代码

    这个“jni接口实现最简单案例源代码”应该是提供了一个基础的示例,帮助开发者理解如何在Java程序中使用JNI。 首先,JNI的核心概念是Java本地方法(Native Method),这是一种可以被Java虚拟机(JVM)调用的非Java...

    Android使用JNI案例

    本案例"Android使用JNI"将深入探讨如何在Android应用中有效地运用JNI技术。 首先,JNI的核心概念是本地方法接口,它为Java虚拟机(JVM)提供了一个桥梁,使得Java代码能够调用本地(native)代码,反之亦然。要使用...

    android JNI学习三实例

    3. 实现本地方法:在生成的C/C++源文件中,实现这些本地方法。 4. 配置Android.mk或CMakeLists.txt:为本地方法构建过程配置编译规则。 5. 编译链接库:使用NDK编译C/C++源文件,生成.so动态链接库。 6. 在Android...

    jni返回对象数组例子

    在JNI中,我们可以编写C/C++代码来扩展Java应用程序,实现一些Java无法直接完成的功能,比如访问操作系统底层服务或者调用已有的C库。本示例主要探讨如何在JNI中创建并返回一个对象数组到Java层。 首先,我们需要...

    jni自学手册+案例

    这份“JNI自学手册+案例”应该包含了一些关于如何使用JNI的基本概念、API讲解以及实战应用。 首先,JNI的核心是为Java程序员提供了一种方式来编写本地方法(Native Method),这些方法可以使用非Java语言(如C++或C...

    AIDL和JNI使用的小例子

    在某些情况下,你可能需要通过AIDL在Java层调用一个使用JNI实现的函数。例如,服务端通过AIDL暴露一个接口,而这个接口的方法在JNI中实现,以利用C/C++的性能优势。客户端通过调用AIDL接口,间接地触发JNI中的操作。...

    JNI详解中文版本

    - 通过JNI实现必要的桥梁函数,以便Java代码可以调用C/C++函数,反之亦然。 - 在游戏逻辑中混合使用Java和C/C++代码。 #### 六、结论 JNI作为一种重要的跨语言通信工具,为Java开发者提供了强大的扩展能力和性能...

    TTS+JNI (delphi)案例

    标题中的"TTS+JNI (delphi)案例"指的是一个使用Delphi编程语言创建的动态链接库(DLL),该库被设计用于与Java应用程序交互,实现文本到语音(TTS)的功能,并能将朗读的音频转换为WAV格式。这个案例提供完整的源...

    Java(JNI) 连接OPC服务器 读写数据 完整源代码

    在本案例中,JNI被用来连接OPC(OLE for Process Control)服务器,这是一种工业自动化领域的标准接口,用于不同设备和系统之间的数据交换。 OPC服务器是一个中间件,它提供了与工业控制系统设备通信的标准接口。...

Global site tag (gtag.js) - Google Analytics