Java调用Native方法

2023-11-11

Java调用Native方法

Java中支持调用其他语言(C、C++),想要实现调用,需要进行以下几步操作。

编写Java类并声明Native方法

package my.mynative.background;

public class Student {

    public native int getAge();

    public native void setAge(int age);

    static{
        //载入动态链接库,参数为动态链接库的名称
        System.loadLibrary("Student"); 
    }

}

生成**.h头文件

**.h文件是C或者C++语言中的头文件,类似于Java中的接口类
  1. 首先将Java类进行javac Student.java 编译成class文件

  2. 使用JDK自带jni生成**.h头文件,命令为:javah -jni Student

    **.h文件生成后名称为my_mynative_background_Student.h,打开该文件结果如下:

    /*这个文件正常情况下不用修改*/
    /* DO NOT EDIT THIS FILE - it is machine generated */
    #include <jni.h>
    /* Header for class Student */
    
    #ifndef _Included_Student
    #define _Included_Student
    #ifdef __cplusplus
    extern "C" {
    #endif
    /*
     * 这个是根据我们Java中定义的Native方法自动生成的
     * Java_my_mynative_background_Student_getAge名称生成的规则为:Java_类的包名_类名_方法名
     * Class:     Student
     * Method:    getAge
     * Signature: ()I
     */
    JNIEXPORT jint JNICALL Java_my_mynative_background_Student_getAge
      (JNIEnv *, jobject);
    
    /*
     * 同上方一样,也是自动生成的
     * Class:     Student
     * Method:    setAge
     * Signature: (I)V
     */
    JNIEXPORT void JNICALL Java_my_mynative_background_Student_setAge
      (JNIEnv *, jobject, jint);
    
    #ifdef __cplusplus
    }
    #endif
    #endif
    

生成DLL文件

我们在这里生成DLL文件使用的工具为DEV-C,可以自行去网上下载。
(注:下载时请根据自己的操作系统位数下载,比如64位操作系统下载时请下载支持64位的工具)
  1. 下载安装完成之后打开DEV工具,点击左上角:文件->新建->项目->basic->DLL,然后选择C项目,名称为System.loadLibrary时参数的名称,然后选择工作空间。

  2. 创建完成后左侧目录中就可以看到自己新建的DLL项目,然后点击项目右键,选择New File,创建一个后缀为.cpp的文件(.cpp文件类似于Java中的接口实现类),编写如下信息:

    /*#include类似Java中的import,将我们刚刚生成头文件**.h通过""引入
    (双引号引入默认会从编辑的文件目录开始查找,尖括号引入的头文件会从系统目录开始查找)*/
    
    #include "my_mynative_background_Student.h"
    
    /*引用C内置头文件*/
    
    #include <stdio.h>
    
    /*引用JDK中jni头文件*/
    
    #include <jni.h>
    
    
    int age;
    
    /*
     * 重写我们刚刚生成的.h头文件中定义的方法,请注意要给参数加上名称(JNIEnv对象提供了java与C类型互转或者调用java方法提供了工具方法,jobject是如果在java中定义的Native方法是类方法,那么它则是该类的对象,如果是静态Native方法,则····百度去吧)
     * Class:     Student
     * Method:    getName
     * Signature: ()Ljava/lang/String;
     */
    JNIEXPORT jint JNICALL Java_my_mynative_background_Student_getAge
      (JNIEnv *env, jobject obj){
        /*返回值为jint,jint可以和C中int直接互转,不需要其他操作,但是如果是其他类型,比如String或者java的对象类型的话需要进行其他的辅助操作进行转换*/
        return age;
      }
    
    /*
     * Class:     Student
     * Method:    setName
     * Signature: (Ljava/lang/String;)V
     */
    JNIEXPORT void JNICALL Java_my_mynative_background_Student_setAge
      (JNIEnv *env, jobject obj, jint a){
        age = a;
      }
    
  3. .cpp文件编写完成之后我们需要将其依赖的.h头文件复制到相应的目录中

    • 将我们自己生成**.h头文件放入与.cpp文件相同目录下
    • 将%JAVA_HOME%/include/jni.h文件和%JAVA_HOME%/include/win32/jni_md.h文件复制到系统目录/include下(系统目录即使用的工具IDE安装目录下会有一个include,该目录下存放的是C内置的头文件,比如我的安装路径为:C:\Program Files (x86)\Dev-Cpp,那么我需要复制到C:\Program Files (x86)\Dev-Cpp\MinGW64\x86_64-w64-mingw32\include目录下,具体地址需要看情况)
  4. 然后点击运行->编译,之后在我们的工作空间中就可以找到.dll文件

运行Java程序并调用本地方法

  1. 将dll文件复制到我们的Eclipse项目中,具体放到哪里自己决定,我的项目将dll文件复制到src/main/resources/dll路径

  2. 然后右键项目->properties->java Build Path->Source->MyNative/src/main/java(定义Native方法所在的类的包)->Native libary location,然后点击右侧Edit->Workspace选择src/main/resources/dll目录即可

  3. 调用本地方法,进行测试。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java调用Native方法 的相关文章

随机推荐

  • 探索人工智能

    前言 模型训练是指使用算法和数据对机器学习模型进行参数调整和优化的过程 模型训练一般包含以下步骤 数据收集 数据预处理 模型选择 模型训练 模型评估 超参数调优 模型部署 持续优化 文章目录 前言 数据收集 数据预处理 模型选择 模型训练
  • Tracy 小笔记 Vue - 路由

    Vue Router 路由中有一个非常重要的概念叫路由表 本质上就是一个映射表 决定了数据包的指向 服务器渲染 后端渲染 如 jsp php java 服务器直接生产渲染好对应的 html 页面 返回到客户端进行展示 这种情况下渲染好的页面
  • java实现截图功能

    java实现截图功能 java实现截图 录屏 public static void main String args throws InterruptedException 截取整个屏幕 保存在H盘下 名字为当前时间毫秒值 格式为png T
  • Unity3D-UI--Layout组件

    Layout组件 自动排版 Layout Group Vertical Layout Group 垂直布局 垂直布局组 组件将其子布局元素彼此重叠 它们的高度由各自的最小高度 首选高度和柔性高度决定 具体取决于以下模型 Vertical L
  • Activity之间的跳转的两种实现方法

    概括 在Android当中 Activity的跳转有两种方法 第一个是利用startActivity Intent intent 的方法 第二个则是利用startActivityForResult Intent intent int req
  • QT添加外部动态库

    编译完动态库 将动态库debug文件夹中的 a和 dll拷贝下来 在window中 dll 动态库 lib 静态库 在linux中 so 动态库 a 静态库 在根目录下新建include 并放入其中 同样的把头文件也放入include中 然
  • 图论基本概念

    文章目录 图 相邻 度 简单图 路径 子图 连通 无向图 有向图 本章概述了图论中的一些概念 部分内容来源于 OI Wiki 图 图 Graph 是一个由 点集 Vertex set 和 边集 Edge set 组成的二元组 常用 G V
  • 哈工大深圳计算机水平怎么样,还原一个真实的哈工大!——十问(转载)

    发信人 hiticeberg 千面怪 信区 NewExpress 标 题 还原一个真实的哈工大 十问 发信站 水木社区 Fri May 30 19 37 50 2008 站内 作为哈工大的土著 也许也是目前连续在校时间最长的哈工大学子 在毕
  • [蓝桥杯][2013年第四届真题]剪格子

    一定要好好审题啊 行号和列号跟题意要求的搞反了 结果de到怀疑人生了 这个题给的数据量不大 所以我就放心大胆的在每个中间节点里各开了一个vis标记数组 用来记录每一条广搜路径走过的节点 include
  • 微信小程序使用 scss

    一 在 vscode 中安装 easy sass 扩展 二 在微信开发者工具导入 vscode 安装的 easy sass 扩展 安装完成后会让重新加载扩展 再次打开后就可以看到扩展已经有 easy sass 了 三 修改 easy sas
  • 【雕爷学编程】MicroPython手册之 WiPy 特定端口库 wipy.machine.I2C.readfrom()

    MicroPython是为了在嵌入式系统中运行Python 3编程语言而设计的轻量级版本解释器 与常规Python相比 MicroPython解释器体积小 仅100KB左右 通过编译成二进制Executable文件运行 执行效率较高 它使用
  • 用logrotate拆分nginx日志

    被遗忘的Logrotate
  • uban服务器系统,Web服务器-并发服务器-Epoll(3.4.5)

    1 介绍 epoll是一种解决方案 nginx就是用的这个 中心思想 不要再使用多进程 多线程了 使用单进程 单线程去实现并发 在上面博客实现的代码中使用过的轮询去查看套接字有没有数据 而epoll是主动通知 当使用多进程的时候 是复制一份
  • osg学习(六十九)平移、旋转、缩放实现过程

    1 主程序 osg PositionAttitudeTransform patTransform new osg PositionAttitudeTransform patTransform gt setPosition l2wMatrix
  • SuperSocket教程八:通过服务器计划将数据推送到客户端

    前面我们知道了如何使用客户端去连接服务端 然后给服务端发送消息 根据消息的关键字服务端进行返回等等 但是那都是来自客户端的请求 我们服务端如何去主动给客户端发消息呢 这些逻辑到哪里去写呢 这里我写了一份代码供大家参考 官方文档说了 建议se
  • 视听融合综述(一)Audiovisual Fusion: Challenges and New Approaches

    分享一篇视听融合研究综述 2015年发表在Proceedings of the IEEE上 该期刊创刊于1913年 是IEEE最古老的杂志之一 主要刊登一些综述和科学前沿的调查研究 review survey and tutorial 不刊
  • 【react】_state的简写方式

    在真实的类组件中 不会出现构造器 想把自定义的属性添加到实例对象上 在类中直接赋值即可 但切记 只有固定的值才可能这样写 如果赋的是一个变量 还是要写构造器 class Weather extends React Component con
  • CDN中,字体文件的跨域问题和解决

    来源 CDN中 字体文件的跨域问题和解决 由于网站的资源文件使用的是另外的域名 这样做是便于浏览器在加载时可以提高加载效率 关于domain hash也就是多域名来加速访问的问题有空再说 这样主域名和资源的域名尤其是字体文件 就形成跨域访问
  • 【计算机视觉

    文章目录 一 检测相关 13篇 1 1 DiffusionEngine Diffusion Model is Scalable Data Engine for Object Detection 1 2 ClusterFusion Lever
  • Java调用Native方法

    Java调用Native方法 Java中支持调用其他语言 C C 想要实现调用 需要进行以下几步操作 编写Java类并声明Native方法 package my mynative background public class Studen