java调用c jni_Java调用C JNI

JAVA以其跨平台的特性深受人们喜爱,而又正由于它的跨平台的目的,使得它和本地机器的各种内部联系变得很少,约束了它的功能。解决JAVA对本地操作的一种方法就是JNI。

JAVA通过JNI调用本地方法,而本地方法是以库文件的形式存放的(在WINDOWS平台上是DLL文件形式,在UNIX机器上是SO文件形式)。通过调用本地的库文件的内部方法,使JAVA可以实现和本地机器的紧密联系,调用系统级的各接口方法。

简单介绍及应用如下:

一、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++程序调用来生成所需的库文件。

二、C/C++中所需要做的工作

对于已生成的.h头文件,C/C++所需要做的,就是把它的各个方法具体的实现。然后编译连接成库文件即可。再把库文件拷贝到JAVA程序的路径下面,就可以用JAVA调用C/C++所实现的功能了。

接上例子。我们先看一下testdll.h文件的内容:

/* DO NOT EDIT THIS FILE - it is machine generated */

#include

/* 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 。把goodluck.dll拷贝到testdll.class的目录下,java testdll运行它,就可以观察到结果了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/528549.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java websphere mq_如何在java中使用WebSphere MQ?

Java中使用websphere websphere mq:用于传输信息 具有跨平台的功能。1 安装websphere mq并启动2 websphere mq建立queue Manager(如:MQSI_SAMPLE_QM)3 建立queue类型选择Local类型的(如lq)4 建立channels类型选择Server Connection(如BridgeChannel)以下…

java 序列化保存_保存到二进制/序列化Java

我必须报价,1.将帐户保存到二进制(序列化)文件中。2.从二进制(序列化)文件加载(重新创建)帐户。因此,首先,我正在查找确切的例子,而我却迷失了自己,在同样的情况下,人们提到xml,在我的脑海中&am…

java控制excel_java操作excel

1. 生成并下载excel文件controllerRequestMapping(value "/download", method RequestMethod.GET)public xxx downloadFile(HttpServletResponse response) {response.setContentType("application/octet-stream");response.setHeader("content-typ…

java 方法权限_Java控制访问权限的方法

这篇博客主要用来介绍Java中的访问权限.引入访问控制权限我们都知道,一个通用类库(如:JDK)开发出来的目的是让普通开发者重用以节省开发时间与精力,但是类库的设计不可能在刚开始就尽善尽美,普通开发者在对类库的使用过程中&#…

java套接字客户端_使用Java从客户端套接字读取数据(Read data from a client socket in Java)...

使用Java从客户端套接字读取数据(Read data from a client socket in Java)我编写了从客户端套接字发送/接收数据的代码。 发送数据步骤已成功完成,但是当我想从套接字读取数据时, readLine()方法阻止程序,而没有要读取的数据。这是我的代码&…

xml动态生成java_从XML文档动态生成Java类

考虑这种情况:我有一个名为person.xml的XML文件,其中包含以下数据.MrFoo28如果我想将这个XML读入Java对象,我将创建一个名为PersonBean的Java bean(使用属性的getter / setter):class Person{String name;int age;}我可以使用任何API来读取XML并填充Java…

java lpad oracle_Oracal的Lpad函数

2007-09-21 17:13 | pinty回复楼上,根据LEVEL的数决定输出“-”的个数,看下面的例子SELECT LEVEL, LPAD( ,2*(LEVEL - 1)) || lname "EMPLOYEE",emp_id, manager_emp_idFROM employeeSTART WITH emp_id 7839CONNECT BY NOCYCLE PRIOR emp_id …

用java输入学生姓名查询成绩_编写一个Java程序,提示用户输入学生数量,学生姓名和他们的成绩,并按照成绩的降序打印学生姓名...

importjava.util.Scanner;publicclassmyclass{publicstaticvoidmain(String[]args){ScannerinputnewScanner(System.in);System.out.print("请输入学生个数,学生姓名以及学生成绩");...import java.util.Scanner;public class myclass{public static void…

java对xml解析_Java中对xml的解析

// 1.通过DocumentBuilderFactor创建解析工厂DocumentBuilderFactory builderFactory DocumentBuilderFactory.newInstance();// 2.通过工厂获得解析器DocumentBuilder builder builderFactory.newDocumentBuilder();// 3.通过parser方法获取DocumentDocument document buil…

刻画小狗状态java_JAVA面向接口编程

JAVA面向接口编程小狗在不同环境条件下可能呈现不同的状态,小狗通过调用 cry()方法体现自己的当前的状 态。要求用接口封装小狗的状态。具体要求如下。• 编写一个接口 DogState,该接口有一个名字为 void showState()的方法。• 编写 Dog 类,…

java jdbc(mysql)驱动源码分析_JAVA JDBC(MySQL)驱动源码分析(二)

本文系转载,地址:http://blog.csdn.net/brilliancezhou/article/details/5425687上一篇中分析了Class.forName(“com.mysql.jdbc.Driver”)幕后所做的事情,也就是在Driver实现类中的静态块和构造函数,本篇主要来分析一下静态块的一…

java %3c%=a%%3e_跪求帮忙解析,急!!!

xml 这个参数的值,是被 urlencode 两次的东西。 php 不懂, Python 的话是用 urllib.unquote 就可以了。>>> s %3C%3Fxmlversion%3D%221.0%22encoding%3D%22gbk%22%3F%3E%253Ctask%253E%253Cuser%253E%253Coper%253Emod%253C%252Foper%253E%253…

java环境变量一闪而过_Java环境变量配置和Tomcat启动时cmd界面一闪而过问题

Java环境变量配置计算机 -> 属性 -> 高级系统设置 -> 环境变量 -> 系统变量中配置Java环境变量。配置JAVA_HOME,属于必配项,如果不配置,直接指定path路径利用工具可以进行Java项目开发,但是后期使用Tomcat开发会出现问…

ubuntu启动php-fpm_ubuntu安装php-fpm+xdebug

一、安装程序包1、sudo apt-get install php5-dev2、sudo apt-get install php5-xdebug二、修改php.ini配置文件; 修改/etc/php5/fpm/php.ini或在增加文件/etc/init.d/php5/conf.d/xdebug.ini; configuration for php Xdebug module;extentionxdebug.so[xdebug]zend_extension/…

php 图片合成,PHP中多张图片合成一张图片例子

今天分享一段PHP中多张图片合成一张图片的代码实现,我们可以在图片合成,水印,九宫格等需求下使用到类似这样的图片合成效果,下面一起来看看例子吧。今天分享一段PHP中多张图片合成一张图片的代码实现,我们可以在图片合成&#xff…

php的cms是什么意思,phpcms是什么

phpcms是一款具备文章、下载、图片、分类信息、影视、商城、采集、财务等众多功能的强大、易用、可扩展的优秀网站管理软件;该软件采用模块化开发,支持多种分类方式,使其可方便实现个性化网站的设计、开发与维护。phpcms是一款具备文章、下载…

php5.4源码下载,WordPress v5.4.2官方正式版源码下载

源码说明WordPress 5.4.2 正式版发布了,此安全和维护版本具有23个修复和增强功能。此外,它还添加了许多安全修复程序-请参阅下面的列表。这些错误会影响WordPress 5.4.1和更早版本。5.4.2版修复了这些问题,因此您需要升级。如果尚未更新到5.4…

前端vue后端java,Vue调用后端java接口的实例代码_亦心_前端开发者

前段时间 做了个学校的春萌项目,其中用到先上后端接口代码:package controller;import net.sf.json.JSONObject;import util.DBUtil;import javax.servlet.ServletException;import javax.servlet.annotation.WebServlet;import javax.servlet.http.Http…

边缘检测滤波matlab,卷积滤波器与边缘检测

频率:对于声音,频率实际上是指声波振荡的速度高低频率高频图像是强度变化很大的图像。并且亮度级别从一个像素到下一个像素快速变化。低频图像可以是亮度相对均匀或变化非常慢的图像。这是一个例子中最容易看到的。大多数图像都有高频和低频成分。在上图…

php 读取 stl 文件,科学网—[转载]【源码】读取ASCII STL文件的STLReader - 刘春静的博文...

读取包含顶点和面的ASCII STL文件,并将其构造为矩阵“顶点”、“颜色”和“面”。之后,使用各小模块在Matlab上建立模型。Read ASCII STL file which contains vertexes and faces and structure it to matrixes "vertexes", "colors&quo…