Centos: java.lang.Ошибка неудовлетворительной ссылки: com.slytechs.library.NativeLibrary.dlopen(Ljava/lang/String;)J

#java-native-interface #shared-libraries #centos7 #libpcap #jnetpcap

#java-native-interface . #разделяемые библиотеки #centos7 #libpcap #jnetpcap

Вопрос:

Я загрузил «jnetpcap-1.4.r1425-1.linux64.x86_64.tgz», как выглядит поврежденное дерево каталогов.

  jnetpcap-1.4.r1425
â   âââ CHANGE_LOG.txt
â   âââ COPYING
â   âââ COPYING.LESSER
â   âââ include
â   â   âââ analysis.h
â   â   âââ export.h
â   â   âââ jnetpcap_bpf.h
â   â   âââ jnetpcap_dumper.h
â   â   âââ jnetpcap_ids.h
â   â   âââ jnetpcap_utils.h
â   â   âââ mac_addr.h
â   â   âââ nio_jbuffer.h
â   â   âââ nio_jmemory.h
â   â   âââ packet_flow.h
â   â   âââ packet_jscanner.h
â   â   âââ packet_protocol.h
â   â   âââ util_crc16.h
â   â   âââ util_crc32.h
â   â   âââ util_debug.h
â   â   âââ util_in_cksum.h
â   â   âââ winpcap_ext.h
â   â   âââ winpcap_ids.h
â   â   âââ winpcap_stat_ex.h
â   âââ jnetpcap.jar
â   âââ libjnetpcap-pcap100.so
â   âââ libjnetpcap.so
â   âââ RELEASE_NOTES.txt
  

Я поместил jar в папку lib, а другой файл .so и собственную папку — в bin, где выполняется моя программа.

Но все равно я получаю

 java.lang.UnsatisfiedLinkError: com.slytechs.library.NativeLibrary.dlopen(Ljava/lang/String;)J
    at com.slytechs.library.NativeLibrary.dlopen(Native Method)
    at com.slytechs.library.NativeLibrary.<init>(Unknown Source)
    at com.slytechs.library.JNILibrary.<init>(Unknown Source)
    at com.slytechs.library.JNILibrary.loadLibrary(Unknown Source)
    at com.slytechs.library.JNILibrary.register(Unknown Source)
    at com.slytechs.library.JNILibrary.register(Unknown Source)
    at com.slytechs.library.JNILibrary.register(Unknown Source)
    at org.jnetpcap.PcapBpfProgram.<clinit>(Unknown Source)
    at pcap.reconst.reconstructor.jnetpcap.PCAPProvider.<init>(PCAPProvider.java:34)
    at pcap.reconst.reconstructor.jnetpcap.PcapReconstructor.reconstruct(PcapReconstructor.java:129)
  

Затем я подумал открыть jar и посмотреть, какой файл он пытается загрузить.
И я нашел

 package com.slytechs.library;

import java.util.Collection;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;

@Library(natives={"Kernel"}, jni={"jnetpcap"})
public class NativeLibrary
  

Итак, мой вопрос в том, какой файл он пытался загрузить изначально

@Library(natives={«Ядро»}, jni={«jnetpcap«})

Я подозреваю, что jnetpcap.so и этот файл недоступен вместе с пакетом.

В Windows у меня возникла проблема с зависимостью, которая требовала wpcap.dll и пакет.dll отсутствует, поэтому я разместил и смог выполнить.

Для centos библиотека даже не загружается.

И если я сделаю ldd *.*, то здесь, как я вижу, обнаруживается некоторая зависимость.

 [root@ajay-centos jnetpcap-1.4.r1425]# ldd *.*
CHANGE_LOG.txt:
ldd: warning: you do not have execution permission for `./CHANGE_LOG.txt'
    not a dynamic executable
COPYING.LESSER:
ldd: warning: you do not have execution permission for `./COPYING.LESSER'
    not a dynamic executable
jnetpcap.jar:
ldd: warning: you do not have execution permission for `./jnetpcap.jar'
    not a dynamic executable
libjnetpcap-pcap100.so:
ldd: warning: you do not have execution permission for `./libjnetpcap-pcap100.so'
    linux-vdso.so.1 =>  (0x00007ffc7db75000)
    libstdc  .so.6 => /lib64/libstdc  .so.6 (0x00007ff58fcca000)
    libjnetpcap.so => not found
    libpcap.so => not found
    libc.so.6 => /lib64/libc.so.6 (0x00007ff58f906000)
    libm.so.6 => /lib64/libm.so.6 (0x00007ff58f604000)
    /lib64/ld-linux-x86-64.so.2 (0x00005612c81b7000)
    libgcc_s.so.1 => /lib64/libgcc_s.so.1 (0x00007ff58f3ed000)
libjnetpcap.so:
ldd: warning: you do not have execution permission for `./libjnetpcap.so'
    linux-vdso.so.1 =>  (0x00007ffd785cb000)
    libstdc  .so.6 => /lib64/libstdc  .so.6 (0x00007fb786ba2000)
    libpcap.so => not found
    libc.so.6 => /lib64/libc.so.6 (0x00007fb7867de000)
    libm.so.6 => /lib64/libm.so.6 (0x00007fb7864dc000)
    /lib64/ld-linux-x86-64.so.2 (0x000055d6d5c57000)
    libgcc_s.so.1 => /lib64/libgcc_s.so.1 (0x00007fb7862c6000)
RELEASE_NOTES.txt:
ldd: warning: you do not have execution permission for `./RELEASE_NOTES.txt'
    not a dynamic executable.
  

Я вижу много опубликованных вопросов, в которых люди говорят, измените имя файла .so и многое другое.

Каким было бы исправление в centos. И более конкретно @Library(natives={«Ядро»}, jni={«jnetpcap»}) Что такое jni ={«jentpcap»} и natives ={«Ядро»}