我正在使用一个java应用程序,它需要.dllWindows中java.library.path中的文件.要在Linux中运行相同的应用程序,我有相应的.so文件应该添加到java.library.pathlinux机器中,到目前为止我没有找到任何简单的解决方案
我确实把.so它放在了一个已经在类路径中的文件夹中,但是我的应用程序仍然抱怨没有所需的.so文件java.library.path
我想找到:
.so方法java.library.path 我有一个共享库,由我无法控制的另一个应用程序使用,需要*.so对象.我的库使用sqlite3,它需要与它静态链接(我绝对需要一个自包含的二进制文件).
当我尝试编译和链接我的库时:
-fpic -flto -pthread -m64
-flto -static -shared
Run Code Online (Sandbox Code Playgroud)
我最终得到以下错误:
/usr/bin/ld: /usr/local/lib/gcc/x86_64-unknown-linux-gnu/4.6.1/crtbeginT.o: relocation R_X86_64_32 against `__DTOR_END__' can not be used when making a shared object; recompile with -fPIC
/usr/local/lib/gcc/x86_64-unknown-linux-gnu/4.6.1/crtbeginT.o: could not read symbols: Bad value
collect2: ld returned 1 exit status
Run Code Online (Sandbox Code Playgroud)
什么是与-fPIC相关的重新编译?我的代码还是CRT?
我已经尝试用-fPIC编译我的对象,结果相同.
谢谢.
编辑:
这个问题似乎与SQLite3无关.
我写了一个简单的单行无用库,它编译和链接如下:
g++ -c -fPIC -o bar.o bar.cpp
g++ -shared -o bar.so bar.o
Run Code Online (Sandbox Code Playgroud)
但不是这样的:
g++ -c -fPIC -o bar.o bar.cpp
g++ -static -shared -o bar.so bar.o
Run Code Online (Sandbox Code Playgroud)
问题似乎与CRT(crtbeginT.o)有关.我应该重新编译GCC - 用pic还是其他什么?
有没有办法so从我的Java代码中调用库中的函数?通常,是否可以so在Java程序中使用Linux 库?
我有一套Java程序,在我们的Linux服务器上用作命令行工具.他们中的大多数都使用在STDERR上打印进度条的类,类似于Perl Term::ProgressBar.
我想在STDERR进入终端时显示进度条,并在重定向STDERR时自动禁用自身,以便重定向数据中没有所有类型的进度条.
检查System.console() == null是我的第一个想法,但重定向STDOUT就足以实现这一点true,即使STDERR仍在进入终端.有什么我可以检查特定于STDERR的东西吗?特定于Linux或使用本机API的解决方案可以满足我的需求.
如何解决致命错误jvmti.h没有这样的文件或目录编译终止c代码ubuntu?我的代码是:
JNIEXPORT jint JNICALL Agent_OnLoad(JavaVM*jvm,char*options,void*reserved){
/*我们返回JNI_OK表示成功*/printf("\n name name,\n \n");
返回JNI_OK;
}
JNIEXPORT void JNICALL Agent_OnUnload(JavaVM*vm){}
在终端中输入以下命令:gcc -Wall -W -Werror first_agent.c -o firstagent
first_agent.c:1:19:致命错误:jvmti.h:没有终止此类文件或目录编译.
其中java jdk版本为javac 1.7.0_25
其中gcc版本gcc版本4.7.3(Ubuntu/Linaro 4.7.3-2ubuntu4)
这里应该将gcc版本更新到4.8?
我正在尝试在Windows上重新创建本教程: Java Native Interface(JNI)
当我尝试编译它时,我收到以下错误:
fatal error: jni.h: No such file or directory
#include <jni.h>
compilation terminated.
Run Code Online (Sandbox Code Playgroud)
我的命令行是:
gcc -Wl,--add-stdcall-alias -IC:\Program_Files\Java\jdk1.7.0_45\include -IC:\Program_Files\Java\jdk1.7.0_45\include\win32 -shared -o hello.dll HelloJNI.c
Run Code Online (Sandbox Code Playgroud)
我在所有文件所在的文件夹中编译.
我确信此文件夹中的文件"jni.h"位于:
C:\Program Files\Java\jdk1.7.0_45\include
Run Code Online (Sandbox Code Playgroud)
有谁知道为什么import语句不起作用?
谢谢!