Java中的native方法实现(Java混用C/C++)__枸杞子_的博客-程序员宅基地

技术标签: Java_积累版  java  jni  native  

前言

  • native关键字说明其修饰的方法是一个原生态方法,方法对应的实现不是在当前文件,而是在用其他语言(如C和C++)实现的文件中。Java语言本身不能对操作系统底层进行访问和操作,但是可以通过JNI接口调用其他语言来实现对底层的访问。
  • JNI是Java本机接口(Java Native Interface),是一个本机编程接口,它是Java软件开发工具箱(Java Software Development Kit,SDK)的一部分。JNI允许Java代码使用以其他语言编写的代码和代码库。Invocation API(JNI的一部分)可以用来将Java虚拟机(JVM)嵌入到本机应用程序中,从而允许程序员从本机代码内部调用Java代码。不过,对Java外部的调用通常不能移植到其他平台,在applet中还可能引发安全异常。实现本地代码将使您的Java应用程序无法通过100%纯Java测试。

实现步骤

1.书写一个Java类

public class HelloWorld {
    // 使用关键字native来声明方法
    public native void displayInfor(String name);

    // 加载动态链接库 
    static {
        System.load("/Users/mac/Desktop/HelloWorldImpl.dylib");
    }

    public static void main(String[] args) {
        HelloWorld helloWorld = new HelloWorld();
        helloWorld.displayInfor("冯强");
    }
}

其中public native void displayInfor(String name);,声明了一个本地方法,有参数name,返回类型void。
System.load(“/Users/mac/Desktop/HelloWorldImpl.dylib”);表示加载一个本地动态链接库。

2.使用下javac命令编译该文件:

Macs-MacBook-Pro:Desktop mac$ javac HelloWorld.java 

我们会看到生成了一个HelloWorld.class文件
微信公众号:JavaWeb架构师

3.使用javah命令处理HelloWorld.class文件

Macs-MacBook-Pro:Desktop mac$ javah -jni HelloWorld

这时候我们可以看到生成了一个HelloWorld.h文件:
图片.png

4.打开HelloWorld.h文件

/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class HelloWorld */

#ifndef _Included_HelloWorld
#define _Included_HelloWorld
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     HelloWorld
 * Method:    displayInfor
 * Signature: (Ljava/lang/String;)V
 */
JNIEXPORT void JNICALL Java_HelloWorld_displayInfor
  (JNIEnv *, jobject, jstring);

#ifdef __cplusplus
}
#endif
#endif

其中:

JNIEXPORT void JNICALL Java_HelloWorld_displayInfor
  (JNIEnv *, jobject, jstring);

就是Java代码中对应的native方法,命名格式是 Java_类名_方法名(JNIEnv,jobject,这里是参数)。

5.修改HelloWorld.h文件中的#include

// 引入刚刚通过class文件生成的.h文件
#include "HelloWorld.h"
#include <stdio.h>
#include <iostream>

using namespace std;
/*
 * Class:     HelloWorld
 * Method:    displayInfor
 * Signature: (Ljava/lang/String;)V
 */
JNIEXPORT void JNICALL Java_HelloWorld_displayInfor
(JNIEnv * env, jobject obj, jstring name) {
    cout<<"你好,"<<env->GetStringUTFChars(name, NULL)<<endl;
}

微信公众号:JavaWeb架构师

8.使用g++处理HelloWorld.cpp生成动态链接库

Macs-MacBook-Pro:Desktop mac$ g++ -dynamiclib -o HelloWorldImpl.dylib HelloWorld.cpp 

微信公众号:JavaWeb架构师

9.复制HelloWorldImpl.dylib文件的地址,放入到java文件中

System.load("/Users/mac/Desktop/HelloWorldImpl.dylib");

10.最终的文件如下:
微信公众号:JavaWeb架构师

11.运行Java程序

Macs-MacBook-Pro:Desktop mac$ java HelloWorld
你好,冯强

微信公众号:JavaWeb架构师


其它

  • 源码下载
关注下方公众号,回复:jni.code

完整教程PDF版本下载

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_33605778/article/details/78719879

智能推荐

centos7 编译安装lnmp环境(PHP篇二)_懒猫一小只的博客-程序员宅基地

一、安装PHP1、先安装如下依赖包yum install -y gcc gcc-c++ make zlib zlib-devel pcre pcre-devel libjpeg libjpeg-devel libpng libpng-devel freetype freetype-devel libxml2 libxml2-devel glibc glibc-devel glib2 glib2-devel bzip2 bzip2-devel ncurses ncurses-devel curl cu

3dmax:3dmax三维动画之材质/渲染设置的简介、经典案例之详细攻略_听雪闻歌的博客-程序员宅基地

3dmax:3dmax三维动画之材质/渲染设置的简介、经典案例之详细攻略目录3dmax三维动画之材质/渲染设置的简介、经典案例3dmax三维动画之材质/渲染设置的简介3dmax三维动画之材质/渲染设置的经典案例3dmax三维动画之材质/渲染设置的简介、经典案例3dmax三维动画之材质/渲染设置的简介3dmax三维动画之材质/渲染设置的经典案例...

使用ADO智能指针_ConnectionPtr,_CommandPtr及_RecordsetPtr_木鱼-的博客-程序员宅基地__commandptr

使用C++(MFC)操作数据库,首选就是ADO。ADO库包含三个基本接口:_ConnectionPtr接口、_CommandPtr接口和_RecordsetPtr接口。在MFC要使用ADO(COM)首先要引用COM地址,编译器才能够实现。从网上的很多资料都介绍,将EOF重命名,防止和其他冲突,那偶们也这样做反正也不会有坏处。格式如下:#include #import "c:\program

QT C++调用PyQt5_wb175208的博客-程序员宅基地_pyqt5支持c++吗

1.新建Python项目使用QtDesigner设计界面使用PyUIC把设计的界面转换成py文件编写业务代码和Ui文件结合起来SetTextStyleMainWindow.pyimport sysfrom SetTextStyle import Ui_SetTextStylefrom PyQt5.QtWidgets import QMainWindow, QApplication, QCheckBox, QSpinBoxfrom PyQt5.QtGui import QPen, QPal_1671465600

线性代数之矩阵我们需要了解的知识点(增广矩阵矩阵的迹 矩阵的秩阶梯型...)_ShenLiang2025的博客-程序员宅基地_增广矩阵

目录1.1 矩阵的定义.. 11.2 矩阵的运算.. 2矩阵相加.. 2数乘矩阵.. 3矩阵相乘.. 3矩阵的幂.. 5矩阵转置.. 6伴随矩阵.. 6矩阵的逆.. 7分块矩阵.. 7矩阵法看克拉姆法则.. 8延展.. 8矩阵与行列式对比.. 8矩阵运算综合.. 9线性代数之矩阵基础点 矩阵的定义 由m乘n个数aij(i∈[1,m], j∈[1,n],i、j∈Z)排成的m行n列数表记作矩阵...

随便推点

创建Hull Shader_会头痛的可达鸭的博客-程序员宅基地_hull shader

一、前言 Hull Shader是舞台工作三个阶段的第一个阶段,可以实现tessellation, Hull Shader transforms将一组输入控制点 转化为 输出控制点,输入、输出点的数量根据转换内容和数量而变化二、设计Hull shader三、通过ID3D11Device::CreateHullShader创建hull-shader对象 HRESULT CreateHullShader( ...

基本算法_荒海觅的博客-程序员宅基地_share 算法

英文原址:http://www.risc.jku.at/people/ckoutsch/stuff/e_algorithms.html     奥地利符号计算研究所(Research Institute for Symbolic Computation,简称RISC)的Christoph Koutschan博士在自己的页面上发布了一篇文章,提到他做了一个调查,参与者大多

Zabbix常用item汇总及说明_宇翔XGT的博客-程序员宅基地

Zabbix常用item汇总及说明2018.5Zabbix中内置了很多监控参数(Key_),可以获取监控对象中的系统、CPU、网络、内存、文件系统等信息。下面就详细介绍一下这些监控参数的意义。1. 测试获取监控参数内容的方法在Zabbix Server上使用zabbix_get命令可以从监控对象获取监控参数的具体内容。zabbix_get命令的具体使用方法如下:zabbix_get  -s  目标...

什么是八大智能?_人机与认知实验室的博客-程序员宅基地

主要有语言智能、数学逻辑智能、空间智能、身体运动智能、音乐智能、人际智能、自我认知智能、自然认知智能。    八十年代,美国著名发展心理学家、哈佛大学教授霍华德·加德纳博士提出多元智能理论,二十多年来该理论已经广泛应用于欧美国家和亚洲许多国家的幼儿教育上,并且获得了极大的成功。霍华德·加德纳博士指出,人类的智能是多元化而非单一的,主要是由语言智能、数学逻辑智能、空间智能、身体运动智能、音乐智能、人

数字图像处理--02数字图像基础__苏沐的博客-程序员宅基地

数字图像基础图像取样与量化图像的质量层次:对比度像素间的基本关系(考)图像取样与量化取样:图像空间坐标的离散(空间坐标(x,y)的数字化)量化:图像函数值(灰度值、幅度值)的离散、量化编码采样间隔(减小)决定了图像的空间分辨率(增加)采样间隔越大,所得图像像素数越少,空间分辨率低,质量差,严重时出现马赛克效应;采样间隔越小,所得图像像素数越多,空间分辨率高,图像质量好,但数据量大。量化编码长度(增加)决定灰度分辨率(增加)显示分辨率越大越清楚图像的质量层次:1.灰度级:像素的取值范围为

linux 增加磁盘缓冲实例,Linux下SSD缓存加速之bcache使用_吹亚吹的博客-程序员宅基地

在Linux下,使用SSD为HDD加速,目前较为成熟的方案有:flashcache,enhanceIO,dm-cache,bcache等,多方面比较以后最终选择了bcache。 bcache 是一个 Linux 内核块层超速缓存。它允许使用一个或多个高速磁盘驱动器(例如 SSD)作为一个或多个速度低得多的硬盘的超速缓存。bcache 支持直写和写回,不受所用文件系统的约束。默认情况下,它只超速缓存...

推荐文章

热门文章

相关标签