gpt4 book ai didi

java - JNA 加载许多具有相同方法名称的库

转载 作者:太空宇宙 更新时间:2023-11-04 12:09:42 25 4
gpt4 key购买 nike

当我在程序中使用 JNA 调用不同的 .so 时,遇到一些问题。看来我的 native 共享库无法声明同名的方法。

示例:我有一个native1.c:

#include <stdio.h>
int anotherMethod() {
return 100;
}
int method() {
return 1 + anotherMethod();
}

还有一个native2.c:

#include <stdio.h>
int anotherMethod() {
return 200;
}
int method() {
return 2 + anotherMethod();
}

每个都编译在共享库中(libnative1.so 和 libnative2.so)。

$ gcc -m64 -shared -fPIC -o linux-x86-64/libnative1.so native1.c
$ gcc -m64 -shared -fPIC -o linux-x86-64/libnative2.so native2.c

(我使用的是 64 位 Linux)

因此调用 method() 应该返回:

  • 本地语言 101
  • native2 中的 202

我将在一个小的 Java Main 中尝试它:

public static void main(String[] args) {
Native1 native1 = (Native1) Native.loadLibrary("native1", Native1.class);
Native2 native2 = (Native2) Native.loadLibrary("native2", Native2.class);
System.out.println(native1.method());
System.out.println(native2.method());
}

库界面是极简主义的:

public interface Native1 extends Library {
int method();
}

还有

public interface Native2 extends Library {
int method();
}

我得到:

101 // OK

102 // Should be 202 !

这意味着调用了 good method(),但是当我的 native 代码调用 anotherMethod() 时,只调用了 native1 中的方法。

我认为 Native.loadLibrary() 加载我的共享库并将其展平,因此只有第一个“anotherMethod”符号存在。

在我的现实情况中,C 代码不属于我的责任,它是由另一个编辑器提供的,所以我需要编辑的越少越好

有没有一种方法可以轻松分离每个共享库,例如在命名空间中或者我错过的 gcc 选项?

最佳答案

调用Native.loadLibrary()时,您可以提供选项的 Map,其中包括键 Library.OPTION_OPEN_FLAGS 以及与 RTLD_LOCAL 对应的值。这应该可以解决您的问题。

Map options = new HashMap();
int RTLD_LOCAL = 0x4; // or whatever value it has on your platform
options.put(Library.OPTION_OPEN_FLAGS, RTLD_LOCAL);
Mylib lib = Native.loadLibrary("mylib", Mylib.class, options);

您可以在目标系统上使用 grep RTLD_LOCAL/usr/include/*.h 查找 RTLD_LOCAL 的值。

关于java - JNA 加载许多具有相同方法名称的库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39966246/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com