JNI初探

本文介绍JNI(Java Native Interface)的基本概念,演示如何使用JNI在Java中调用C/C++语言编写的本地库,并通过一个简单的加法示例展示了从定义到实现的完整过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

JNI初探

1. 简介

JNI = java native interface

允许java代码调用c/c++/asm语言编写的本地库.

JNI接口, 用native关键字, 来标识.

java.lang.Object 的相关native方法

java.lang.Object 的相关native方法
public final native Class<?> getClass();
public native int hashCode();
protected native Object clone() throws CloneNotSupportedException;
public final native void notify();
public final native void notifyAll();
public final native void wait(long timeout) throws InterruptedException;

2.Mac下的JniDemo

2.1 native接口(java定义)

public class JniDemo {
    static {
        /**
         * 设置从当前目录查找本地库
         */
        System.setProperty("java.library.path", ".");

        /**
         * 加载本地库
         * 注意, 库名不能带平台相关的前缀和后缀
         * 如, mac下, jnidemo = libjnidemo.dylib (动态库)
         */
        System.loadLibrary("jnidemo");
    }

    public static void main(String[] args) {
        System.out.println("before native add");
        System.out.println(nativeAdd(1, 2));
        System.out.println("after native add");
    }

    public static native int nativeAdd(int a, int b);
}

2.2 native接口(c定义)

  • 编译及生成C头文件
liuxianqiang-mac:demo-java-jni liuxianqiang$ javac JniDemo.java

liuxianqiang-mac:demo-java-jni liuxianqiang$ javah JniDemo

liuxianqiang-mac:demo-java-jni liuxianqiang$ ll
-rw-r--r--  1 liuxianqiang  staff  641 11 27 22:14 JniDemo.java
-rw-r--r--  1 liuxianqiang  staff  750 11 27 22:15 JniDemo.class
-rw-r--r--  1 liuxianqiang  staff  403 11 27 22:15 JniDemo.h
  • JniDemo.h
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class JniDemo */

#ifndef _Included_JniDemo
#define _Included_JniDemo
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     JniDemo
 * Method:    nativeAdd
 * Signature: (II)I
 */
JNIEXPORT jint JNICALL Java_JniDemo_nativeAdd
  (JNIEnv *, jclass, jint, jint);

#ifdef __cplusplus
}
#endif
#endif

2.3 native接口(c实现)

#include "JniDemo.h"

JNIEXPORT jint JNICALL Java_JniDemo_nativeAdd
  (JNIEnv *env, jclass jcls, jint a, jint b){
      printf("inner native add \n");
      return a + b;
}

2.4 编译C程序, 生成动态库

liuxianqiang-mac:demo-java-jni liuxianqiang$ gcc -dynamiclib -I /Library/Java/JavaVirtualMachines/jdk1.8.0_192.jdk/Contents/Home/include/ -I /Library/Java/JavaVirtualMachines/jdk1.8.0_192.jdk/Contents/Home/include/darwin/ JniDemo.c -o libjnidemo.dylib

注意:

  • -dynamiclib: 生成动态库
  • -I: 导入头文件, 因为JniDemo.h依赖了, jni.h.
  • -o: 指定生成的文件名
  • libjnidemo.dylib: for mac, 其中lib是本地库前缀, dylib是本地库后缀, jnidemo是本地库的名称

2.5 运行

liuxianqiang-mac:demo-java-jni liuxianqiang$ ll
-rw-r--r--@ 1 liuxianqiang  staff   638 11 27 22:37 JniDemo.java
-rw-r--r--  1 liuxianqiang  staff   750 11 27 22:37 JniDemo.class
-rw-r--r--@ 1 liuxianqiang  staff   383 11 27 22:37 JniDemo.h
-rw-r--r--@ 1 liuxianqiang  staff   319 11 27 22:41 JniDemo.c
-rwxr-xr-x  1 liuxianqiang  staff  8400 11 27 22:42 libjnidemo.dylib*

liuxianqiang-mac:demo-java-jni liuxianqiang$ java JniDemo
before native add
inner native add
3
after native add

2.6 文件列表

文件说明
JniDemo.javanative接口, java定义
JniDemo.classnative接口, java定义, 编译后
JniDemo.hnative接口, c定义
JniDemo.cnative接口, c实现
libjnidemo.dylib编译JniDemo.h, JniDemo.c, 生成的本地库, 供JniDemo.class调用.

3.参考

  1. native方法与JNI实现
  2. Mac下Java JNI调用C
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值