最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

JAVA?JNA調(diào)用C接口的三種實(shí)現(xiàn)方式

 更新時(shí)間:2026年05月06日 15:46:05   作者:jwolf2  
文章主要介紹了使用JNA(Java?Native?Access)調(diào)用C庫的方法,包括繼承Library接口、直接使用`NativeLibrary`實(shí)例和使用頭文件實(shí)現(xiàn)接口等方式,并詳細(xì)描述了在Linux環(huán)境下使用JNA調(diào)用C庫的具體操作步驟,還涉及到了一些遇到的問題的解決方法

1. 準(zhǔn)備一個(gè)共享庫文件

test.c

#include <stdio.h>
int test(char *input){
    printf("input:%s\n",input);
    return 0;
}

libtest.so

[root@node-126 ~]# gcc -fPIC -shared -o libtest.so test.c 
[root@node-126 ~]# ls /root/
anaconda-ks.cfg  libtest.so  node-v6.10.2-linux-x64.tar.xz  original-ks.cfg  spring3  test  test.c

可以看到有test方法

[root@node-126 ~]# nm -D libtest.so 
0000000000201038 B __bss_start
                 w __cxa_finalize
0000000000201038 D _edata
0000000000201040 B _end
0000000000000600 T _fini
                 w __gmon_start__
00000000000004c0 T _init
                 w _ITM_deregisterTMCloneTable
                 w _ITM_registerTMCloneTable
                 U printf
00000000000005d5 T test

2. JNA方式1—繼承Library接口

建個(gè)普通maven項(xiàng)目

       <dependency>
            <groupId>net.java.dev.jna</groupId>
            <artifactId>jna</artifactId>
            <version>5.5.0</version>
        </dependency>
package jna;
import com.sun.jna.Library;
import com.sun.jna.Native;
/**
 * 接口繼承
 *
 * @author majun
 * @version 1.0
 * @since 2023-08-22 22:27
 */
public interface MyClibrary extends Library {
    MyClibrary INSTANTCE = Native.load("/root/libtest.so", MyClibrary.class);
    int test(String input);
}

測試

import jna.MyClibrary;

/**
 * TODO
 *
 * @author majun
 * @version 1.0
 * @since 2023-03-31 7:44
 */
public class Main {
    public static void main(String[] args) {
        int test = MyClibrary.INSTANTCE.test("extend Library");
        System.out.println(test);
    }
}

使用Linux上的Java運(yùn)行

3. JNA方式2—直接NativeLibrary.getInstance

import com.sun.jna.Function;
import com.sun.jna.NativeLibrary;

/**
 * TODO
 *
 * @author majun
 * @version 1.0
 * @since 2023-03-31 7:44
 */
public class Main {
    public static void main(String[] args) {
        NativeLibrary instance = NativeLibrary.getInstance("/root/libtest.so");
        Function func = instance.getFunction("test");
        Object res = func.invoke(Integer.class, new Object[]{"NativeLibrary.getInstance"});
        System.out.println( res);
    }
}

4. JNA方式3—Native方法

mkdir -p /root/jna && cd /root/jna 新建MyNative.java

package jna;
import java.io.IOException;

public class MyNative {
     native int  test(String input) throws IOException;
}

編譯并生成頭文件(這里java17沒找到j(luò)avah命令,改用java8的,但注意javac ,javah要使用同一個(gè)Java版本的)

 /usr/local/jdk1.8.0_111/bin/javac  MyNative.java
 /usr/local/jdk1.8.0_111/bin/javah -classpath /root/ -jni   jna.MyNative

linux直接編輯實(shí)現(xiàn)頭文件中的接口:

#include <stdio.h>
#include <jni.h>
#include "jna_MyNative.h"
jint  Java_jna_MyNative_test(JNIEnv *jniEnv, jobject clazz, jstring input){
    printf("input:%s\n",(char *)input);
    return 0;
}

編譯時(shí)注意引入jdk頭文件包下的jni.h等

gcc -fPIC -shared -I/usr/lib/jvm/jdk-17-oracle-x64/include -I/usr/lib/jvm/jdk-17-oracle-x64/include/linux -o libtest.so test.c

使用Clion實(shí)現(xiàn)頭文件的接口:新建C項(xiàng)目,引入jna_MyNative.h,并實(shí)現(xiàn)其中的方法

注意:

1.使用遠(yuǎn)程toolchain,cmake編譯安裝運(yùn)行,注意cmake版本可能導(dǎo)致include_directories(SYSTEM "/usr/lib/jvm/jdk-17-oracle-x64/include") 同步Linux上jdk的頭文件失敗,本地?zé)o法找到符號(hào),但可以正常運(yùn)行。

2.jniEnv必須Java調(diào)用才會(huì)有值。

cmake_minimum_required(VERSION 2.8)
project(untitled1)

set(CMAKE_CXX_STANDARD 17)
include_directories(SYSTEM "/usr/lib/jvm/jdk-17-oracle-x64/include")
include_directories(SYSTEM "/usr/lib/jvm/jdk-17-oracle-x64/include/linux")

add_executable(testexe main.cpp)
add_library(test SHARED main.cpp jna_MyNative.h)
target_link_libraries(test -I/usr/lib/jvm/jdk-17-oracle-x64/include -I/usr/lib/jvm/jdk-17-oracle-x64/linux)
install(TARGETS test LIBRARY DESTINATION /usr/lib)

Java調(diào)用測試

import jna.MyNative;

import java.io.IOException;

/**
 * TODO
 *
 * @author majun
 * @version 1.0
 * @since 2023-08-23 23:44
 */
public class Main {
    public static void main(String[] args) throws IOException {
        System.load("/root/jna/libtest.so");
        //System.loadLibrary("test");// 自動(dòng)拼接成libtest.so,默認(rèn)從/usr/lib,/usr/lib64等路徑找
        MyNative myNative = new MyNative();
        int test = myNative.test("native");
        System.out.println(test);
    }
}

姿勢3實(shí)現(xiàn)的C接口,Java依舊可以使用姿勢1,2的方式來調(diào)用,注意函數(shù)名為Java_jna_MyNative_test

[root@node-126 lib]# nm -D /usr/lib/libtest.so 
0000000000201070 B __bss_start
                 U __cxa_allocate_exception
                 w __cxa_finalize
                 U __cxa_free_exception
                 U __cxa_throw
0000000000201070 D _edata
0000000000201078 B _end
0000000000000b4c T _fini
                 w __gmon_start__
                 U __gxx_personality_v0
0000000000000860 T _init
                 w _ITM_deregisterTMCloneTable
                 w _ITM_registerTMCloneTable
0000000000000a15 T Java_jna_MyNative_test
                 w _Jv_RegisterClasses
0000000000000ac8 T main
                 U printf
                 U _Unwind_Resume
0000000000000b18 W _ZN7JNIEnv_8ThrowNewEP7_jclassPKc
0000000000000aea W _ZN7JNIEnv_9FindClassEPKc
                 U _ZTIi

總結(jié)

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • 使用ElasticSearch6.0快速實(shí)現(xiàn)全文搜索功能的示例代碼

    使用ElasticSearch6.0快速實(shí)現(xiàn)全文搜索功能的示例代碼

    本篇文章主要介紹了使用ElasticSearch6.0快速實(shí)現(xiàn)全文搜索功能,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2018-02-02
  • SpringBoot集成Serverless的實(shí)現(xiàn)示例

    SpringBoot集成Serverless的實(shí)現(xiàn)示例

    本文主要介紹了SpringBoot集成Serverless的實(shí)現(xiàn)示例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2026-04-04
  • 使用Aop的方式實(shí)現(xiàn)自動(dòng)日志記錄的方式詳細(xì)介紹

    使用Aop的方式實(shí)現(xiàn)自動(dòng)日志記錄的方式詳細(xì)介紹

    這篇文章主要介紹了使用Aop的方式實(shí)現(xiàn)自動(dòng)日志記錄,通過監(jiān)聽器去監(jiān)聽,當(dāng)訪問到具體的類方法,通過aop切面去獲取訪問的方法,然后將日志記錄下來,就這種方式給大家介紹的非常詳細(xì),需要的朋友可以參考下
    2022-04-04
  • Java?深入探究講解簡單工廠模式

    Java?深入探究講解簡單工廠模式

    簡單工廠模式是屬于創(chuàng)建型模式,又叫做靜態(tài)工廠方法(Static Factory Method)模式,但不屬于23種GOF設(shè)計(jì)模式之一。簡單工廠模式是由一個(gè)工廠對(duì)象決定創(chuàng)建出哪一種產(chǎn)品類的實(shí)例。簡單工廠模式是工廠模式家族中最簡單實(shí)用的模式,可以理解為是不同工廠模式的一個(gè)特殊實(shí)現(xiàn)
    2022-04-04
  • Java泛型模擬scala實(shí)現(xiàn)自定義ArrayList方式

    Java泛型模擬scala實(shí)現(xiàn)自定義ArrayList方式

    這篇文章主要介紹了Java泛型模擬scala實(shí)現(xiàn)自定義ArrayList方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-10-10
  • 關(guān)于Spring MVC框架中攔截器Interceptor的使用解讀

    關(guān)于Spring MVC框架中攔截器Interceptor的使用解讀

    這篇文章主要介紹了關(guān)于Spring MVC框架中攔截器Interceptor的使用,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-07-07
  • 詳細(xì)說一說Java自動(dòng)裝箱與拆箱是什么

    詳細(xì)說一說Java自動(dòng)裝箱與拆箱是什么

    自動(dòng)裝箱與拆箱的機(jī)制可以讓我們?cè)贘ava的變量賦值或者是方法調(diào)用等情況下使用原始類型或者對(duì)象類型更加簡單直接,這篇文章主要介紹了Java自動(dòng)裝箱與拆箱是什么的相關(guān)資料,需要的朋友可以參考下
    2025-10-10
  • 關(guān)于java自定義線程池的原理與實(shí)現(xiàn)

    關(guān)于java自定義線程池的原理與實(shí)現(xiàn)

    本文介紹了如何自定義線程池和阻塞隊(duì)列,包括阻塞隊(duì)列的實(shí)現(xiàn)方法,線程池的構(gòu)建以及拒絕策略的應(yīng)用,詳細(xì)闡述了線程池中任務(wù)的提交和執(zhí)行流程,以及如何處理任務(wù)超出隊(duì)列容量的情況
    2022-04-04
  • Java Springboot自動(dòng)裝配原理詳解

    Java Springboot自動(dòng)裝配原理詳解

    這篇文章主要介紹了詳解SpringBoot自動(dòng)配置原理,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2021-10-10
  • Java中Calendar類的一些常用方法小結(jié)

    Java中Calendar類的一些常用方法小結(jié)

    項(xiàng)目當(dāng)中,我們經(jīng)常會(huì)涉及到對(duì)時(shí)間的處理,Date類最主要的作用就是獲得當(dāng)前時(shí)間,同時(shí)這個(gè)類里面也具有設(shè)置時(shí)間以及一些其他的功能,但更推薦使用 Calendar 類進(jìn)行時(shí)間和日期的處理,這篇文章主要給大家介紹了關(guān)于Java中Calendar類的一些常用方法,需要的朋友可以參考下
    2021-11-11

最新評(píng)論

正镶白旗| 营口市| 雷波县| 景泰县| 临沂市| 鸡泽县| 桐梓县| 尚义县| 清水县| 双鸭山市| 盐山县| 水城县| 屏东市| 秭归县| 镇康县| 翁牛特旗| 会理县| 托克托县| 嘉祥县| 清新县| 铜梁县| 临澧县| 澄江县| 林周县| 铜川市| 达日县| 隆林| 哈密市| 碌曲县| 六盘水市| 盐边县| 新干县| 张家界市| 丹江口市| 洪湖市| 安徽省| 大港区| 郁南县| 星子县| 青河县| 扎兰屯市|