Java(11)通过JNI调用C/C++动态链接库Demo

主要参考了这篇文章:原文链接


一、软件环境

硬件:树莓派CM4
操作系统:官方64位
编译工具:g++
JDK:11

二、过程

  1. java代码中声明带有native修饰的类方法,该native方法只是在java中进行声明,而不进行实现,在需要调用navtive方法之前进行system.loadLibrary(“xxx”),然后通过类调用方法xxx即可
  2. 使用javah从java的class文件生成与native函数相应的头文件
  3. 通过引用含有native方法声明的头文件,采用C++编写native方法的实现,并将其编译为动态链接库
  4. 对java编译并执行即可
  5. 据说jdk8及以前用javah,以后用javac -h

三、java部分

1、在linux目录编写java代码
nano /home/hellozous/c/com/zouston/TestJNI.java
package com.zouston;

/**
 * 描述:测试JNI
 * 日期: 2022-07-06
 * 时间: 14:11
 *
 * @author: K.L.Zous
 */
public class TestJNI
{
    /**
     * 声明本地库中的函数
     */
    public native void helloWorld();

    public static void main(String[] args)
    {
        //载入本地库
        System.loadLibrary("TestJNI");
        TestJNI t = new TestJNI();
        //调用本地库中的函数
        t.helloWorld();
    }
}
2、生成头文件
javac -h ./ /home/hellozous/c/com/zouston/TestJNI.java

此时生成了com_zouston_TestJNI.h
其中包含如下内容,作为C++中的方法名

JNIEXPORT void JNICALL Java_com_zouston_TestJNI_helloWorld

三、C++部分

1、创建CPP文件
nano /home/hellozous/c/com/zouston/helloWorld.cpp
#include "com_zouston_TestJNI.h"
#include <iostream>

JNIEXPORT void JNICALL Java_com_zouston_TestJNI_helloWorld(JNIEnv *env, jobject obj)
{
    std::cout << "Hello world!" << std::endl;
}
2、生成so
g++ -fPIC -shared -o libTestJNI.so -I /usr/lib/jvm/java-11-openjdk-arm64/include -I /usr/lib/jvm/java-11-openjdk-arm64/include/linux/ helloWorld.cpp
  • -fPIC选项使编译器在编译阶段生成与位置无关的代码,以使共享库能够在内存中被正确加载,PIC即Position, Independent Code。使用-shared选项时必须有该选项,否则编译期会出错
  • -shared编译器生成共享链接库
  • -o后面的动态链接库的命名规则必须与linux下的动态链接库一致,即libxxx.so的形式
  • -I后面跟的是jni所需要的头文件路径
3、运行
cd /home/hellozous/c
java -Djava.library.path=. com.zouston.TestJNI

在这里插入图片描述

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值