概述

Java Native Interface译为Java原生接口,简称JNI。Java并不是完美的,它的不足体现在运行速度要比传统的C++慢上许多,并且无法直接访问到操作系统底层,为此Java提供了JNI实现对于底层访问。说得通俗点,通过JNI可以调用其他程序(本地语言),这个语言要可以和操作系统直接交互(C和C++)

Native

native修饰的函数简单的说就是调用一个非Java代码写的接口,并且native这个关键字可以和其他标识符号连用,但唯独abstract除外(无实现体)。

NativeMain类

public class NativeMain
{
static
{
System.load("D:/Hello.dll");
} public native static void helloC(); public static void main(String[] args)
{
helloC();
}
}

使用javac -d . NativeMain.java编译,得到一个class文件

使用命令javah -jni nativeDemo.NativeMain,此时会在当前文件下产生一个nativeDemo_NativeMain.h文件,这个文件名是由(包名 + 类名)组成,中间用(_)隔开。

我们打开这个文件看下,一脸懵逼。我们尝试看下能看懂的部分,可以看出helloC()函数,生成的是Java_nativeDemo_NativeMain_helloC(JNIEnv *, jclass)函数,Java的数据类型都会按一定规则映射为本地的数据类型,而这些数据类型都是包含的头文件jni.h里定义的。_cplusplus是自定义宏,表示这是一段cpp的代码,加入extern“C”{和}处理其中的代码,JNIEXPORT可以看做是jni的一个标志,void返回值。

1.打开VS,新建一个项目,命名为Hello

2.把我们刚才nativeDemo_NativeMain.h复制到VS的项目下,找到安装java的位置,复制jni.h和jni_md.h放置到VS的hello项目下(右边为jni.h和jni_md位置,lz安装位置)

3.右键头文件>添加>现有项,添加我们刚才复制的三个头文件。

4.右键源文件>添加>新建项,选择.cpp文件,叫做hello.cpp,实现一个弹出窗口。

#include "stdafx.h"

#include <iostream>

#include "nativeDemo_NativeMain.h"

#include<windows.h>

#include<cstdio>

using namespace std;

JNIEXPORT void JNICALL Java_nativeDemo_NativeMain_helloC
(JNIEnv *, jclass)
{
int x;
x = MessageBox(GetForegroundWindow(),"【Java-JNI】","Hello World",);
printf("%d\n",x);
}

这时调用MessageBox()函数可能会出错:不能将参数 2 从"const char [9]"转换为"LPCWSTR",这是Unicode的问题,项目菜单->最后的属性->配置属性->常规->项目默认值->unicode改为未设置。

5.现在计算机基本都是64位的,要额外为64位计算机生成一个.dll文件

如果没有X64点击下拉菜单,配置管理器配置一下。

6.项目右键>生成,就有一个.dll文件了

7.将hello.dll文件扔到D盘下,运行NativeMain类

8.弹出框,成功弹出,并且打出日志。

Native带来的缺陷

我们已经成功调用一个非Java代码的接口,弥补Java的性能缺陷,会发现过程有点繁琐。使用后给我们带来什么影响?

  1. 牺牲Java的安全性,无法受到安全网的保护。
  2. 必须格外留意应用程序中的代码,并使用良好的实践来保障应用程序的总体完整性,否则可能导致性能变差,甚至程序崩溃。
  3. Java的可移植性变差。

总结

native关键字修饰的函数(方法),说明这个函数是原生函数,也就是这个函数是用C/C++语言实现的,并且被编译成了DLL,由java去调用。

参考:《自己实现一个Native方法调用》

==========================================================================

发现错误,请留言,lz及时修改,避免误导后来者,感谢!!!

Java Native Interface调用C++代码的更多相关文章

  1. Java Native Interface 六JNI中的异常

    本文是<The Java Native Interface Programmer's Guide and Specification>读书笔记 在这里只讨论调用JNI方法可能会出现的异常, ...

  2. Java Native Interface 五 JNI里的多线程与JNI方法的注册

    本文是<The Java Native Interface Programmer's Guide and Specification>读书笔记 JNI里的多线程 在本地方法里写有关多线程的 ...

  3. Java Native Interface 四--JNI中引用类型

    本文是<The Java Native Interface Programmer's Guide and Specification>读书笔记 JNI支持将类实例和数组类型(如jobjec ...

  4. Java Native Interface 编程系列一

    本文是<Java Native Interface Programmer's Guide and Specification>的读书笔记 Java Native Interface可以让编 ...

  5. android 学习随笔二十七(JNI:Java Native Interface,JAVA原生接口 )

    JNI(Java Native Interface,JAVA原生接口) 使用JNI可以使Java代码和其他语言写的代码(如C/C++代码)进行交互. 问:为什么要进行交互? 首先,Java语言提供的类 ...

  6. 【详解】JNI (Java Native Interface) (四)

    案例四:回调实例方法与静态方法 描述:此案例将通过Java调用的C语言代码回调Java方法. 要想调用实例对象的方法,需要进行以下步骤: 1. 通过对象实例,获取到对象类的引用  => GetO ...

  7. 【详解】JNI(Java Native Interface)(一)

    前言: 一提到JNI,多数编程者会下意识地感受到一种无法言喻的恐惧.它给人的第一感觉就是"难",因为它不是单纯地在JVM环境内操作Java代码,而是跳出虚拟机与其他编程语言进行交互 ...

  8. Java Native Interface 基于JNI的嵌入式手机软件开发实例

    1.通过JNI和c/c++的库组件.其他代码交互 2.java和c不能互通的原因时数据类型问题 Introduction https://docs.oracle.com/javase/8/docs/t ...

  9. Java Native Interface Specification Contents 翻译

    https://docs.oracle.com/en/java/javase/12/docs/specs/jni/index.html Google翻译 第1章:简介 本章介绍Java Native ...

随机推荐

  1. 没人看系列----css 随笔

    目录 没人看系列----css 随笔 没人看系列----html随笔 前言 没什么要说的就是自己总结,学习用的如果想学点什么东西,请绕行. CSS (Cascading Style Sheets)层叠 ...

  2. JDBC连接数据库时候出错

    错误提示如下: Fri May 13 09:06:04 CST 2016 WARN: Establishing SSL connection without server's identity ver ...

  3. wxpython实现界面跳转

    wxPython实现Frame之间的跳转/更新的一种方法 wxPython是Python中重要的GUI框架,下面通过自己的方法实现模拟类似PC版微信登录,并跳转到主界面(朋友圈)的流程. (一)项目目 ...

  4. win10更新失败——适用于Windows 10 Version 1709 的03累积更新,适合基于x64系统(KB4088776)更新失败

    相信最近很多人被windows的更新折磨坏了,下面来介绍一下解决办法,有用的话请点赞! 首先将C盘中的这个文件夹删除:"C:\Windows\System32\Tasks\Microsoft ...

  5. 2018 CISCN reverse wp

    2018 CISCN reverse wp 这题比赛的时候没做出来,主要是心态崩了看不下去..赛后看了下网上的wp发现不难,是自己想复杂了.这里将我的思路和exp放出来,希望大家一起交流学习. mai ...

  6. python笔记:#014#综合应用

    综合应用 -- 名片管理系统 目标 综合应用已经学习过的知识点: 变量 流程控制 函数 模块 开发 名片管理系统 系统需求 程序启动,显示名片管理系统欢迎界面,并显示功能菜单 ************ ...

  7. LeetCode_图像渲染

    题目: 有一幅以二维整数数组表示的图画,每一个整数表示该图画的像素值大小,数值在 0 到 65535 之间. 给你一个坐标 (sr, sc) 表示图像渲染开始的像素值(行 ,列)和一个新的颜色值 ne ...

  8. mac下安装Python3.*(最新版本)

    前言:mac系统自带python,不过以当前mac系统的最新版本为例,自带的python版本都是2.*版本,虽然不影响老版本项目的运行,但是python最新的3.*版本的一些语法与2.*版本并不相同, ...

  9. Python_Excel文件操作

    ''' 使用xlrd模块写入Excel文件 ''' import xlrd book=xlrd.open_workbook(r'/Users/c2apple/Desktop/纪录/测试报告/张涛文件盘 ...

  10. MySQL类型float double decimal的区别

    语法 MySQL 浮点型和定点型可以用类型名称后加(M,D)来表示,M表示该值的总共长度,D表示小数点后面的长度,M和D又称为精度和标度,如float(7,4)的 可显示为-999.9999,MySQ ...