Java JNI 使用笔记

简介

JNI 的全称是 Java Native Interface,是一种 Java 的 Native 编程接口,支持 Java 与 C/C++ 直接相互调用,从 JDK 1.0 开始提供。

基本使用流程

通过一个简单的例子来介绍下 JNI 的使用方法,对整体 JNI 有个初步的整体概念。

1. native method

定义一个 Java 类,其中包含 native 方法,另外通过 loadLibrary 来加载动态库。

<pre class="prettyprint hljs java" style="padding: 0.5em; font-family: Menlo, Monaco, Consolas, &quot;Courier New&quot;, monospace; color: rgb(68, 68, 68); border-radius: 4px; display: block; margin: 0px 0px 1.5em; font-size: 14px; line-height: 1.5em; word-break: break-all; overflow-wrap: break-word; white-space: pre; background-color: rgb(246, 246, 246); border: none; overflow-x: auto;">package jni;

class JniDemo {
  static {
    // 这里是加载一个名叫 libjnidemo 的动态库,后缀会根据OS不同而不同
    System.loadLibrary("jnidemo");
  }

  public native void nativeMethod();
}

额外说明:

  1. 动态库需要在 java 启动参数的 -Djava.library.path= 中定义,否则会报动态库找不到的错误
  2. 对于苹果的 M1 电脑,需要额外注意动态库是属于那种架构(aarch64 和 x86_64),需要与使用的 jdk 保持一致

2. generate header

JDK 默认自动的工具可以生成头文件

<pre class="prettyprint hljs ruby" style="padding: 0.5em; font-family: Menlo, Monaco, Consolas, &quot;Courier New&quot;, monospace; color: rgb(68, 68, 68); border-radius: 4px; display: block; margin: 0px 0px 1.5em; font-size: 14px; line-height: 1.5em; word-break: break-all; overflow-wrap: break-word; white-space: pre; background-color: rgb(246, 246, 246); border: none; overflow-x: auto;"># 1\. javac -h:java 编译为 class,并且生成头文件
${JAVA_HOME}/bin/javac -h . jni/JniDemo.java

# 2\. javah:需要在 classpath 下找到已经编译好的 class
${JAVA_HOME}/javah jni.JniDemo

生成的头文件示例如下:

<pre class="prettyprint hljs cpp" style="padding: 0.5em; font-family: Menlo, Monaco, Consolas, &quot;Courier New&quot;, monospace; color: rgb(68, 68, 68); border-radius: 4px; display: block; margin: 0px 0px 1.5em; font-size: 14px; line-height: 1.5em; word-break: break-all; overflow-wrap: break-word; white-space: pre; background-color: rgb(246, 246, 246); border: none; overflow-x: auto;">// filename
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值