Vle*_*mix 10 linux java-native-interface
我已经在这里看到了这个问题,尝试了提议的修复,但到目前为止我没有成功.我有相当多的Java经验,但JNI很久以前,从来没有在Linux上做过...
我正在尝试在Linux上运行一个简单的HelloWorld JNI应用程序.
小java文件:
class HelloWorld {
private native void print();
public static void main(String[] args){
new HelloWorld().print();
}
static {
System.out.println(System.getProperty("java.library.path"));
System.loadLibrary("HelloWorld");
}
}
Run Code Online (Sandbox Code Playgroud)
小C文件:
#include <jni.h>
#include <stdio.h>
#include "HelloWorld.h"
JNIEXPORT void JNICALL
Java_HelloWorld_print(JNIEnv *env, jobject obj)
{
printf("Hello World!\n");
return;
}
Run Code Online (Sandbox Code Playgroud)
通过以下方式编译C文件:
gcc -shared -Wall -fPIC HelloWorld.c -I/usr/lib/gcc/x86_64-redhat-linux/3.4.3/include/ -o libHelloWorld.so
Run Code Online (Sandbox Code Playgroud)
运行应用程序:
java HelloWorld
Run Code Online (Sandbox Code Playgroud)
要么
java -Djava.library.path=/home/nxp40954/jnitesting/. HelloWorld
Run Code Online (Sandbox Code Playgroud)
但没有好处,得到一个:
Exception in thread "main" java.lang.UnsatisfiedLinkError: /home/nxp40954/jnitesting/libHelloWorld.so: /home/nxp40954/jnitesting/libHelloWorld.so: cannot open shared object file: No such file or directory
Run Code Online (Sandbox Code Playgroud)
奇怪,因为实际上有一个/home/nxp40954/jnitesting/libHelloWorld.so文件.
有人有线索吗?
执行这种方式:
export LD_LIBRARY_PATH=.
java HelloWorld
Run Code Online (Sandbox Code Playgroud)
无法加载.so文件时抛出java.lang.UnsatisfiedLinkError.LD_LIBRARY_PATH变量指向额外的位置以查找*.so文件.
我使用sun java在32位ubuntu上.我正在编译这种方式:
gcc -shared -Wall -fPIC HelloWorld.c -I/usr/lib/jvm/java-6-sun-1.6.0.26/include -I/usr/lib/jvm/java-6-sun-1.6.0.26/include/linux -o libHelloWorld.so
Run Code Online (Sandbox Code Playgroud)
您的示例在 32 位 Linux 安装上对我有用。
您的共享库是编译为 32 位还是 64 位共享库?用命令检查file libHelloWorld.so。如果您的共享库是 64 位,那么您需要-d64在启动 Java 时提供命令行选项,以便 Java 可以加载 64 位共享库。
如果您的共享库是 32 位的,那么 Java 选项-d32可能会解决问题。
| 归档时间: |
|
| 查看次数: |
11804 次 |
| 最近记录: |