Java JNI初探

---说明,之前直接百度出来的例子,照猫画虎。没想到的是这例子居然直接来自百度百科,写着写着就囧了。。

---anyway,写完了就当是给自己看吧。

 

同事求助,就看了一下,照猫画虎一番,略有所得。

 

 

JNI是什么?

NI是 Java Native Interface 的缩写,它提供了若干的API实现了Java和其他语言的通信(主要是C&C++)。从Java1.1开始,JNI标准成为java平台的一部分,它允许Java代码和其他语言写的代码进行交互。JNI一开始是为了本地已编译语言,尤其是C和C++而设计的,但是它并不妨碍你使用其他编程语言,只要调用约定受支持就可以了。使用java与本地已编译的代码交互,通常会丧失平台可移植性。

-- 以上来自百度百科

 

JNI步骤

① java类中编写带有native 声明的方法。

② 使用 javac 命令编译所编写的java类。

③ 使用 javah 命令生成头文件。

④ 使用C/C++实现本地方法。

⑤ 生成动态连接库。

⑥ 执行(java)。

--还是来自百度百科

 

JNI实例

1 public class HelloWorld {
2     public native void displayHelloWorld();//所有native关键词修饰的都是对本地的声明
3     static {
4         System.loadLibrary("hello");//载入本地库
5     }
6     public static void main(String[] args) {
7         new HelloWorld().displayHelloWorld();
8     }
9 }

javac HelloWorld.java

javah HelloWorld

编写本地方法实现和由javah命令生成的头文件里面声明的方法名相同的方法。

  建议用vs,新建 Win Console - DLL 项目,新建文件:HelloWorldImpl.cpp

 1 #include "jni.h"
 2 #include "HelloWorld.h"
 3  
 4 //#include other headers
 5  
 6 JNIEXPORT void JNICALL
 7 Java_HelloWorld_displayHelloWorld(JNIEnv*env,jobject obj)
 8 {
 9     printf("Helloworld!\n");
10     return;
11 }

注意,这里使用的是"jni.h",也可以使用<jni.h>。前者将jni.h文件复制进来即可,后者需要在项目中引入其所在的文件夹($JAVA_HOME$/include)。

但是,据我实测,实际上还需要 jni_md.h 文件,要么复制进来,要么引入其所在的文件夹($JAVA_HOME$/include/win32)。

⑤ 如无问题,就可以进行编译了。这里要注意一点,如果jdk是64位版本,那么dll也需要64位的。vs可以直接设置生成的版本。

虽然可以使用单独的命令来生成dll文件,不过这里只是一个练习,直接build项目即可生成,然后在文件夹中就能找到。

⑥ 由于我们在Java中调用的hello,所以需要将该dll复制到java所在的文件夹,并重命名。

    static {System.loadLibrary("hello");//载入本地库}

然后,运行即可。

 

一般来说,如果第三方有提供dll,那可以直接调用执行。

 

ps:如果不用vs,那也可以使用gcc,参考百度百科。

 

转载于:https://www.cnblogs.com/larryzeal/p/5687392.html

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

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

相关文章

前端学习(2020)vue之电商管理系统电商系统之完成商品添加操作

目录结构 router.js import Vue from vue import Router from vue-router import Login from ./components/Login.vue import Home from ./components/Home.vue import Welcome from ./components/Welcome.vue import Users from ./components/user/Users.vue import Right fr…

cocos2d-lua ARPG手机游戏《烈焰遮天》(客户端+服务端+数据库)发布说明

服务器发布流程及其规范1&#xff0c;环境准备 a, mvn命令行&#xff1a;从\\10.21.210.161\share\tools\apache-maven-3.1.1-bin.tar.gz取出安装包&#xff0c; 解压到本地目录A&#xff0c;添加环境变量M2_HOME指向A&#xff0c;并在系统Path环境变量中增加&qu…

webScoket的浅短的认识

在一般的发送数据请求的时候都是用的http协议&#xff0c;但是对于类似即时聊天&#xff0c;需要客户端与服务器不间断的交互的时候对于http协议来说就不太适用了。因为http协议无法主动把数据发到客户端&#xff0c;而且客户端发送请求之后就会断开连接&#xff0c;无法达到我…

xshell报编码问题时可以修改xshell编码

转载于:https://www.cnblogs.com/Mina89/p/5690529.html

前端学习(2023)vue之电商管理系统电商系统之通过路由加载订单列表

目录结构 router.js import Vue from vue import Router from vue-router import Login from ./components/Login.vue import Home from ./components/Home.vue import Welcome from ./components/Welcome.vue import Users from ./components/user/Users.vue import Right fr…

(( 所谓data

数据与 数据预处理 s1 – s1 单位化/归一化

访问github很慢问题

文章目录 访问github很慢问题解决重点来了&#xff1a;测试后发现访问&#xff0c;速度飞起实测&#xff0c;香不香&#xff0c;真香&#xff01;wget下载到一半断了&#xff0c;重连方法我是使用wget去下载elkeidup_image_v1.9.1.tar.gz.00压缩包wget的下载中断重新连接下载指…

GitHub干货分享(APP引导页的高度集成 - DHGuidePageHUD)

每一个APP都会用到APP引导页&#xff0c;分量不重但是不可缺少&#xff0c;不论是APP的首次安装还是版本的更新&#xff0c;首先展现给用户眼前的也就只有它了&#xff0c;当然这里讲的不是APP引导页的美化而是APP引导页的高度集成&#xff0c;一行代码搞定APP引导页是不是太夸…

(( data

,有时&#xff0c;数据来自熟知的生成源&#xff0c;它可以用f(x)数学描述。 部分来自对客观自然世界的观察 其二 在一些场合&#xff0c;虽然有数据 但是 不知道数据先验于什么分布 (( [注: 所谓分布&#xff0c;是基于统计抽象与统计经验&#xff0c; 倒果为 非

前端学习(2024)vue之电商管理系统电商系统之根据分页获取订单列表数据

目录结构 router.js import Vue from vue import Router from vue-router import Login from ./components/Login.vue import Home from ./components/Home.vue import Welcome from ./components/Welcome.vue import Users from ./components/user/Users.vue import Right fr…

Round Numbers

题意/Description: 正如你所知&#xff0c;奶牛们没有手指以至于不能玩“石头剪刀布”来任意地决定例如谁先挤奶的顺序。她们甚至也不能通过仍硬币的方式。 所以她们通过"round number"竞赛的方式。第一头牛选取一个整数&#xff0c;小于20亿。第二头牛也这样…

(( 系统的自协调与抽象而成的自动反馈

(( 工业机械化制品&#xff0c;为了实现各种复杂的控制任务&#xff0c;首先要将被控对象和控制装置按照一定的方式连接&#xff0c;组成一个类有机整体&#xff0c;一般这被称为自动控制系统。 基于客观自然观察到的&#xff0c;抽象简化而言控制装置可以采用不同的原理或所谓…

前端学习(2025)vue之电商管理系统电商系统之渲染订单列表数据

目录结构 router.js import Vue from vue import Router from vue-router import Login from ./components/Login.vue import Home from ./components/Home.vue import Welcome from ./components/Welcome.vue import Users from ./components/user/Users.vue import Right fr…

异步返回参数封装

package com.sprucetec.tms.distribute.app.entity;import java.io.Serializable;public class AppResult<T> implements Serializable{ /** * */ private static final long serialVersionUID -883388648899116220L; /** * 失败0成功1 */ pri…

(( 映射

(( 时域与频域的映射 直角(整数域)与极坐标(所谓角度)的映射

前端学习(2026)vue之电商管理系统电商系统之实现分页功能

目录结构 router.js import Vue from vue import Router from vue-router import Login from ./components/Login.vue import Home from ./components/Home.vue import Welcome from ./components/Welcome.vue import Users from ./components/user/Users.vue import Right fr…

关于单片机串口发送和接收的问题

串口初始化过程&#xff1a; 1、确定T/C1的工作方式--TMOD 2、设置T/C初始值----------------------------TH1、TH2 3、启动T/C-----------------------------------TR1 4、串行口的控制------------------------------SCON 5、串口在中断方式下&#xff0c;需要开CPU和源中断-…