`
liweitsky
  • 浏览: 44592 次
  • 性别: 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
分享到:
评论

相关推荐

    android上jni实现

    简单的android上的jni实现案例,非常便于初学者理解。可直接运行出结果的。

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

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

    TTS+JNI (delphi)案例

    本例采用Delphi写Dll,java调用,实现简单TTS朗读和转wav. 带源码和编译文件以及注释。

    Android项目_jni操作指南.rar

    7. 实际案例:通过一个完整的示例项目,展示了如何在实际开发中运用JNI技术实现Java与C/C++的交互。 本资源适合对Android开发有一定基础的开发者,可以帮助您快速掌握JNI技术的使用方法,为您的项目添加更多功能。...

    Android_NDK_JNI

    在Android平台下实现java调用c++代码的精短小案例

    《Java编程技巧典型案例解析》随书光盘

    实例27 利用JNI实现企业Java程序与传统应用程序的集成 实例35 Java Servlet驱动SQLServer中的数据库 实例37 Java对象系列化技术在分布式数据库中的应用 实例38 基于URL的Webs服务器数据访问 实例42 Matlab...

    Rust与Java进行交互实例代码

    Rust与Java进行交互实例代码,使用JNI技术,实现Rust与JAVA的相互调用,从而提高执行效率,本资源是文章《【一起学Rust | 进阶篇 | jni库】JNI实现Java与Rust进行交互》的配套案例代码,供读者进行学习,查看,以...

    基于Android+NDK进行OpenGL_ES开发的完整案例

    一个使用NDK技术通过JNI实现android Java层与C层的数据交互,并结合OpenGL_ES 在C层实现一个3D效果代码,在Java层用于显示的软件。

    Android数独C++算法案例

    android通过JNI用C++实现的数独计算的算法

    Android平台 使用OpenGLES3.0实现纹理纹理、颜色混合

    在Android平台,使用OpenGLES3.0实现纹理纹理、颜色混合代码实现举例。 具体案例文章讲解请见: https://xiaxl.blog.csdn.net/article/details/121634894

    Andorid案例分享 168套

    AnderWeb-android_packages_apps_...andorid 源码北京公交线路查询(离线)android Gallery实现异步加裁网络图片...Android ListView下拉刷新Demo Android SMS短信内容显示在一个泡泡...Android打包签名从生成...

    linux之 kernel添加node节点案例

    本文档需要使用ultra-edit代开,里面实现了linux kernel设备节点的全部代码,可以直接在linux 上编译验证。...通过此节点的实现,android可以透过JNI 或者 IPC binder实现android java和 linux内核数据交互。

    《Android C++高级编程——使用NDK》_源码.zip

    《Android C++高级编程——使用NDK》提供了Java原生接口(JNI)的概述、Bionic API、POSIX 线程和套接字、C++支持、原生图形和声音API以及NEON/SIMD优化,在一个游戏应用案例的帮助下,你将学到很多关键技能。...

    Android JNI加密项目,目前集合DES,AES两种加密算法.zip

    这部分内容包含了多个精心设计的Android项目案例,从需求分析、设计思路到实现过程,都有详细的讲解和代码示例。学习者可以通过实际操作,深入了解Android开发的整个流程,提升自己的实战能力。 此外,我们还提供了...

    Android 初学中阶高阶书籍_集合打包2

    用,Android实现GPS定位,Android通过JNI调用驱动程序,Android网络开发详解,android写的google map api 应用,android学 习资料大全,Android音视频的编解码,Android应用框架原理与程序设计36技(高焕堂著、简体版),...

    Android 初学中阶高阶书籍_集合打包3

    用,Android实现GPS定位,Android通过JNI调用驱动程序,Android网络开发详解,android写的google map api 应用,android学 习资料大全,Android音视频的编解码,Android应用框架原理与程序设计36技(高焕堂著、简体版),...

    Android底层开发技术实战详解--内核、移植和驱动.(电子工业.王振丽).part1

    本书从底层原理开始讲起,结合真实的案例向读者详细介绍了android内核、移植和驱动开发的整个流程。全书分为19章,依次讲解驱动移植的必要性,何为hal层深入分析,goldfish、msm、map内核和驱动解析,显示系统、输入...

    Android底层开发技术实战详解--内核、移植和驱动.(电子工业.王振丽).part3

    本书从底层原理开始讲起,结合真实的案例向读者详细介绍了android内核、移植和驱动开发的整个流程。全书分为19章,依次讲解驱动移植的必要性,何为hal层深入分析,goldfish、msm、map内核和驱动解析,显示系统、输入...

    Android底层开发技术实战详解--内核、移植和驱动.(电子工业.王振丽).part2

    本书从底层原理开始讲起,结合真实的案例向读者详细介绍了android内核、移植和驱动开发的整个流程。全书分为19章,依次讲解驱动移植的必要性,何为hal层深入分析,goldfish、msm、map内核和驱动解析,显示系统、输入...

Global site tag (gtag.js) - Google Analytics