关于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实现案例,非常便于初学者理解。可直接运行出结果的。
jni接口实现最简单案例源代码
本例采用Delphi写Dll,java调用,实现简单TTS朗读和转wav. 带源码和编译文件以及注释。
7. 实际案例:通过一个完整的示例项目,展示了如何在实际开发中运用JNI技术实现Java与C/C++的交互。 本资源适合对Android开发有一定基础的开发者,可以帮助您快速掌握JNI技术的使用方法,为您的项目添加更多功能。...
在Android平台下实现java调用c++代码的精短小案例
实例27 利用JNI实现企业Java程序与传统应用程序的集成 实例35 Java Servlet驱动SQLServer中的数据库 实例37 Java对象系列化技术在分布式数据库中的应用 实例38 基于URL的Webs服务器数据访问 实例42 Matlab...
Rust与Java进行交互实例代码,使用JNI技术,实现Rust与JAVA的相互调用,从而提高执行效率,本资源是文章《【一起学Rust | 进阶篇 | jni库】JNI实现Java与Rust进行交互》的配套案例代码,供读者进行学习,查看,以...
一个使用NDK技术通过JNI实现android Java层与C层的数据交互,并结合OpenGL_ES 在C层实现一个3D效果代码,在Java层用于显示的软件。
android通过JNI用C++实现的数独计算的算法
在Android平台,使用OpenGLES3.0实现纹理纹理、颜色混合代码实现举例。 具体案例文章讲解请见: https://xiaxl.blog.csdn.net/article/details/121634894
AnderWeb-android_packages_apps_...andorid 源码北京公交线路查询(离线)android Gallery实现异步加裁网络图片...Android ListView下拉刷新Demo Android SMS短信内容显示在一个泡泡...Android打包签名从生成...
本文档需要使用ultra-edit代开,里面实现了linux kernel设备节点的全部代码,可以直接在linux 上编译验证。...通过此节点的实现,android可以透过JNI 或者 IPC binder实现android java和 linux内核数据交互。
《Android C++高级编程——使用NDK》提供了Java原生接口(JNI)的概述、Bionic API、POSIX 线程和套接字、C++支持、原生图形和声音API以及NEON/SIMD优化,在一个游戏应用案例的帮助下,你将学到很多关键技能。...
这部分内容包含了多个精心设计的Android项目案例,从需求分析、设计思路到实现过程,都有详细的讲解和代码示例。学习者可以通过实际操作,深入了解Android开发的整个流程,提升自己的实战能力。 此外,我们还提供了...
用,Android实现GPS定位,Android通过JNI调用驱动程序,Android网络开发详解,android写的google map api 应用,android学 习资料大全,Android音视频的编解码,Android应用框架原理与程序设计36技(高焕堂著、简体版),...
用,Android实现GPS定位,Android通过JNI调用驱动程序,Android网络开发详解,android写的google map api 应用,android学 习资料大全,Android音视频的编解码,Android应用框架原理与程序设计36技(高焕堂著、简体版),...
本书从底层原理开始讲起,结合真实的案例向读者详细介绍了android内核、移植和驱动开发的整个流程。全书分为19章,依次讲解驱动移植的必要性,何为hal层深入分析,goldfish、msm、map内核和驱动解析,显示系统、输入...
本书从底层原理开始讲起,结合真实的案例向读者详细介绍了android内核、移植和驱动开发的整个流程。全书分为19章,依次讲解驱动移植的必要性,何为hal层深入分析,goldfish、msm、map内核和驱动解析,显示系统、输入...
本书从底层原理开始讲起,结合真实的案例向读者详细介绍了android内核、移植和驱动开发的整个流程。全书分为19章,依次讲解驱动移植的必要性,何为hal层深入分析,goldfish、msm、map内核和驱动解析,显示系统、输入...