簡體   English   中英

從Java調用C++共享lib方法找不到類方法的定義

[英]Call of C++ shared lib method from Java can't find definition of class method

我需要在 Debian 上從 Java 調用 .so lib 函數。 我用這個 Java/JNA 代碼來做:

interface MyLib extends Library {
    MyLib INSTANCE = (MyLib) Native.loadLibrary("mylib.so", MyLib.class);
    int fff();
}

// ...

MyLib m = MyLib.INSTANCE;
System.out.println(m.fff());

這是我的 C++ 代碼:

.h2

class A1
{
   public:
   void f();
};

.cpp2

#include ".h2"

void A1::f()
{
   std::cout << "from A1" << std::endl;
}

.h1
extern "C"
{
   int fff();
}

.cpp1

#include ".h1"
#include ".h2"

int fff()
{
   // A1().f(); // ERROR CODE

   return 38;
}

如果注釋了錯誤代碼 - 一切正常,C++ .so 的 Java 調用成功,我得到“38”。 但是如果錯誤代碼被取消注釋,我會收到這個錯誤

#
# A fatal error has been detected by the Java Runtime Environment:
#
#  SIGSEGV (0xb) at pc=0x000000000005bb66, pid=14991, tid=14992
#
# JRE version: Java(TM) SE Runtime Environment (10.0.2+13) (build 10.0.2+13)
# Java VM: Java HotSpot(TM) 64-Bit Server VM (10.0.2+13, mixed mode, tiered, compressed oops, g1 gc, linux-amd64)
# Problematic frame:
# C  0x000000000005bb66
#
# No core dump will be written. Core dumps have been disabled. To enable core dumping, try "ulimit -c unlimited" before starting Java again
#
# An error report file with more information is saved as:
# /home/devuser/dev/ktv/tlv/hs_err_pid14991.log
#
# If you would like to submit a bug report, please visit:
#   http://bugreport.java.com/bugreport/crash.jsp
# The crash happened outside the Java Virtual Machine in native code.
# See problematic frame for where to report the bug.
#
Aborted

如果我將A1:: f()定義放到 h2 標頭中 - 一切都還可以。

看來,Java 在 cpp2 文件中找不到A1:: f()定義。 為什么?

我應該讓我所有的代碼層次結構,由fff()調用標記為extern "C"嗎?

好吧,我在暗戀日志中發現了這個錯誤:

Event: 0.300 Thread 0x00007f4338011000 Exception <a 'java/lang/NoSuchMethodError'{0x00000000c5a96018}: method resolution failed> (0x00000000c5a96018) thrown at [/scratch/opt/mach5/mesos/work_dir/slaves/c4ee7e63-1ded-4e8c-9581-ce26f27e3af4-S497/frameworks/1735e8a2-a1db-478c-8104-60c8b0af87dd-01
Event: 0.300 Thread 0x00007f4338011000 Exception <a 'java/lang/NoSuchMethodError'{0x00000000c5a99b40}: java.lang.invoke.DirectMethodHandle$Holder.invokeStaticInit(Ljava/lang/Object;Ljava/lang/Object;JLjava/lang/Object;)Ljava/lang/Object;> (0x00000000c5a99b40) thrown at [/scratch/opt/mach5/meso
Event: 0.301 Thread 0x00007f4338011000 Exception <a 'java/lang/NoSuchMethodError'{0x00000000c5a9fd60}: method resolution failed> (0x00000000c5a9fd60) thrown at [/scratch/opt/mach5/mesos/work_dir/slaves/c4ee7e63-1ded-4e8c-9581-ce26f27e3af4-S497/frameworks/1735e8a2-a1db-478c-8104-60c8b0af87dd-01
Event: 0.302 Thread 0x00007f4338011000 Exception <a 'java/lang/NoSuchMethodError'{0x00000000c5aa3708}: method resolution failed> (0x00000000c5aa3708) thrown at [/scratch/opt/mach5/mesos/work_dir/slaves/c4ee7e63-1ded-4e8c-9581-ce26f27e3af4-S497/frameworks/1735e8a2-a1db-478c-8104-60c8b0af87dd-01
Event: 0.306 Thread 0x00007f4338011000 Exception <a 'java/lang/NoSuchMethodError'{0x00000000c5aadfd0}: java.lang.invoke.DirectMethodHandle$Holder.invokeStatic(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;I)Ljava/lang/Object;> (0x00000000c5aadfd0) thrown at [/scratch/opt/mach5/mesos/wo
Event: 0.306 Thread 0x00007f4338011000 Exception <a 'java/lang/NoSuchMethodError'{0x00000000c5ab1e20}: java.lang.invoke.DirectMethodHandle$Holder.invokeSpecial(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;I)Ljava/lang/Object;> (0x00000000c5ab1e20) thrown at [/scratch
Event: 0.320 Thread 0x00007f4338011000 Exception <a 'java/lang/UnsatisfiedLinkError'{0x00000000c5916378}: mylib.so: undefined symbol: _ZTVN4Json10FastWriterE> (0x00000000c5916378) thrown at [/scratch/opt/mach5/mesos/work_dir/slaves/c4ee7e63-1ded-4e8c-9581-ce26f27e3af
Event: 0.324 Thread 0x00007f4338011000 Exception <a 'java/lang/NoSuchMethodError'{0x00000000c59233d0}: method resolution failed> (0x00000000c59233d0) thrown at [/scratch/opt/mach5/mesos/work_dir/slaves/c4ee7e63-1ded-4e8c-9581-ce26f27e3af4-S497/frameworks/1735e8a2-a1db-478c-8104-60c8b0af87dd-01
Event: 0.327 Thread 0x00007f4338011000 Exception <a 'java/lang/NoSuchMethodError'{0x00000000c592e328}: java.lang.invoke.DirectMethodHandle$Holder.invokeStatic(Ljava/lang/Object;Ljava/lang/Object;)I> (0x00000000c592e328) thrown at [/scratch/opt/mach5/mesos/work_dir/slaves/c4ee7e63-1ded-4e8c-958
Event: 0.330 Thread 0x00007f4338011000 Exception <a 'java/lang/NoSuchMethodError'{0x00000000c593b1f8}: java.lang.Object.of([Ljava/lang/Object;)Ljava/util/stream/Stream;> (0x00000000c593b1f8) thrown at [/scratch/opt/mac

我嘗試解決未定義符號_ZTVN4Json10FastWriterE 的錯誤。 我有/usr/lib/libjsoncpp.so.0.6.0,它導出這個方法,但我不能告訴java得到它:)我所有的設置:

file /usr/lib/libjsoncpp.so.0.6.0
/usr/lib/libjsoncpp.so.0.6.0: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked, BuildID[sha1]=431ec951fde0671c890664dd6f2e18116509a1bc, stripped
...
file mylib.so
mylib.so: ELF 64-bit LSB shared object, x86-64, version 1 (GNU/Linux), dynamically linked, BuildID[sha1]=756a5666d6e1d1ceb1c77be5c70a31d4698f64af, not stripped
...
java --version
java 14.0.2 2020-07-14
Java(TM) SE Runtime Environment (build 14.0.2+12-46)
Java HotSpot(TM) 64-Bit Server VM (build 14.0.2+12-46, mixed mode, sharing)
...
echo $LD_LIBRARY_PATH
/path_to_mylib_dir:/usr/lib
...
run command
java -Djava.library.path=/usr/lib -Djna.library.path=/usr/lib -jar app-1.0-SNAPSHOT.jar
...
.java
static {
System.setProperty("java.library.path", "/path_to_mylib_dir:/usr/lib");
System.setProperty("jna.library.path", "/path_to_mylib_dir:/usr/lib");
}
..
interface MyLib extends Library {
        MyLib INSTANCE = (MyLib) Native.loadLibrary("/path_to_my_lib/mylib.so", MyLib.class);
        int fff();
    }
..
 MyLib m = MyLib.INSTANCE; -- OK
 System.out.println(m.fff());    -- Crash

調試輸出

 sudo java10 -Djava.library.path=/usr/lib/libjsoncpp.so.0.6.0 -Djna.library.path=/usr/lib/libjsoncpp.so.0.6.0 -Dsun.boot.library.path=/usr/lib/libjsoncpp.so.0.6.0 -Djna.debug_load=true  -jar app-1.0-SNAPSHOT.jar mylib.so
Hello4
java lib path : /usr/lib;/usr/lib/libjsoncpp.so.0.6.0
jna lib path : /usr/lib/libjsoncpp.so.0.6.0
start
Nov 06, 2020 2:44:58 PM com.sun.jna.Native extractFromResourcePath
INFO: Looking in classpath from jdk.internal.loader.ClassLoaders$AppClassLoader@69663380 for /com/sun/jna/linux-x86-64/libjnidispatch.so
Nov 06, 2020 2:44:58 PM com.sun.jna.Native extractFromResourcePath
INFO: Found library resource at jar:file:/app-1.0-SNAPSHOT.jar!/com/sun/jna/linux-x86-64/libjnidispatch.so
Nov 06, 2020 2:44:58 PM com.sun.jna.Native extractFromResourcePath
INFO: Extracting library to /root/.cache/JNA/temp/jna12671529648887219091.tmp
Nov 06, 2020 2:44:58 PM com.sun.jna.NativeLibrary loadLibrary
INFO: Looking for library '/../mylib.so'
Nov 06, 2020 2:44:58 PM com.sun.jna.NativeLibrary loadLibrary
INFO: Adding paths from jna.library.path: /usr/lib/libjsoncpp.so.0.6.0
Nov 06, 2020 2:44:58 PM com.sun.jna.NativeLibrary loadLibrary
INFO: Trying /../mylib.so
Nov 06, 2020 2:44:58 PM com.sun.jna.NativeLibrary loadLibrary
INFO: Loading failed with message: /../mylib.so: undefined symbol: _ZTVN4Json10FastWriterE
Nov 06, 2020 2:44:58 PM com.sun.jna.NativeLibrary loadLibrary
INFO: Adding system paths: [/usr/lib/x86_64-linux-gnu, /lib/x86_64-linux-gnu, /lib64, /usr/lib, /lib, /usr/lib/vmware-tools/lib64/libvmGuestLibJava.so, /usr/lib/vmware-tools/lib32/libvmGuestLibJava.so, /usr/lib/vmware-tools/lib64/libvmGuestLib.so, /usr/lib/vmware-tools/lib32/libvmGuestLib.so, /usr/lib/x86_64-linux-gnu/libfakeroot, /usr/lib/vmware-tools/lib64/libDeployPkg.so, /usr/lib/vmware-tools/lib32/libDeployPkg.so]
Nov 06, 2020 2:44:58 PM com.sun.jna.NativeLibrary loadLibrary
INFO: Trying /../mylib.so
Nov 06, 2020 2:44:58 PM com.sun.jna.NativeLibrary loadLibrary
INFO: Found library '/../mylib.so' at /../mylib.so
#
# A fatal error has been detected by the Java Runtime Environment:
#
#  SIGSEGV (0xb) at pc=0x0000000000212716, pid=28990, tid=28991
#
# JRE version: Java(TM) SE Runtime Environment (10.0.2+13) (build 10.0.2+13)

And nm for jsoncpp lib
nm -D ./libjsoncpp.so.0.6.0 |grep  _ZTVN4Json10FastWriterE
00000000002430a0 V _ZTVN4Json10FastWriterE

該問題是通過編譯 c++ .so lib 並添加到 cmakelists.txt 的必要靜態和共享庫來解決的

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM