JNI使用

本文详细介绍如何通过JNI让Java调用C/C++代码。从native关键字的引入到完整的示例代码,包括创建并编译Java类、生成本地方法头文件、用C++实现这些方法并编译成动态链接库,最后加载库并运行程序。

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

对于如何使用JNI的初衷是因为看jdk源码时看到有native关键字,由于对这个关键字很陌生,就查了下,原来是Java调用C/C++写的动态库文件时才使用到的,因此便学习了下,使用方法如下:

native用法:用native修饰的方法表示,该方法的实现不是在当前文件,而是用其它语言(如:C/C++)实现,这些方法允许Java代码与底层操作系统或其他外部库进行交互,从而实现一些Java本身无法直接完成的功能。

使用示例:

package com.summary;

public class JNITest {

    public native void hello();

    static{
        System.loadLibrary("JNITest");
    }

    public static void main(String[] args){
        new JNITest().hello();
        // System.out.println(System.getProperty("java.library.path"));
    }
}




编译:
1、先建立编译后文件存放目录:out/com/summary/, out和src目录同级,如下:
--JNITest
--src
--com
--summary
JNITest.java

--out
--com
--summary
JNITest.class


2、cmd到JacobTest目录下,执行:
javac -d ../out com/summary/JNITest.java


3、cmd到out目录下,执行命令生成供C/C++调用.h文件:
javah -jni com.summary.JNITest


此时可以看到,out目录下生成了一个com_summary_JNITest.h的头文件,不要修改该文件,将此文件作为需要实现OCRSpecialFilm方法的C/C++ 工程使用;


4、用vs建立C++类型为class library的工程,将jdk安装目录下的include目录下的jni_md.h和jni.h以及生成的com_summary_JNITest.h头文件拷贝至C++工程下,
在C++文件中实现com_summary_JNITest.h中声明的方法,如下:

//JNITest.cpp中实现
// This is the main DLL file.

#include "stdafx.h"
#include "JNITest.h"

#include "com_summary_JNITest.h"
#include "jni.h"
#include "jni_md.h"
#include <iostream>

using namespace std;

JNIEXPORT void JNICALL Java_com_summary_JNITest_hello(JNIEnv *, jobject) {
    cout<<"hello world jni test"<<endl;
}

5、编译工程,生成JNITest.dll文件,将该文件拷贝至java类加载目录(如不清楚,可以使用System.out.println(System.getProperty("java.library.path"));打印出相应目录),
再到java工程下运行程序,在控制台打印输出
hello world jni test

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值