当前位置: 技术问答>linux和unix
在LINUX下使用JNI出错
来源: 互联网 发布时间:2016-04-12
本文导语: 1. 先写java程序 class HelloWorld { public native void displayHelloWorld(); static { System.loadLibrary("hello"); } public static void main(String[] args) { new HelloWorld().displayHel...
1. 先写java程序
class HelloWorld
{
public native void displayHelloWorld();
static {
System.loadLibrary("hello");
}
public static void main(String[] args) {
new HelloWorld().displayHelloWorld();
// System.getProperties().list(System.out);
}
}
# javac HelloWorld.java
# javah HelloWorld
2. 写C程序
#include
#include "HelloWorld.h"
#include
JNIEXPORT void JNICALL
Java_HelloWorld_displayHelloWorld(JNIEnv *env, jobject obj)
{
printf("Hello world!n");
return;
}
#gcc hello.c --share -I. -I/usr/local/j2sdk1.4.2_08/include/ -I/usr/local/j2sdk1.4.2_08/include/linux -o libhello.so
生成so文件成功。
3. 设环境变量
export LD_LIBRARY_PATH=/home/mlx/jni(假设程序都在/home/mlx/jni/)
最后运行的时候说:UnsatisfiedLinkError,大概是cannot open shared object file
参照了很多网上的例子,别人都成功了,为什么我会报这个错?:(
class HelloWorld
{
public native void displayHelloWorld();
static {
System.loadLibrary("hello");
}
public static void main(String[] args) {
new HelloWorld().displayHelloWorld();
// System.getProperties().list(System.out);
}
}
# javac HelloWorld.java
# javah HelloWorld
2. 写C程序
#include
#include "HelloWorld.h"
#include
JNIEXPORT void JNICALL
Java_HelloWorld_displayHelloWorld(JNIEnv *env, jobject obj)
{
printf("Hello world!n");
return;
}
#gcc hello.c --share -I. -I/usr/local/j2sdk1.4.2_08/include/ -I/usr/local/j2sdk1.4.2_08/include/linux -o libhello.so
生成so文件成功。
3. 设环境变量
export LD_LIBRARY_PATH=/home/mlx/jni(假设程序都在/home/mlx/jni/)
最后运行的时候说:UnsatisfiedLinkError,大概是cannot open shared object file
参照了很多网上的例子,别人都成功了,为什么我会报这个错?:(
|
这个问题我也白思不得其解,干脆就直接用"System.load(绝对路径)"吧
java jni一般都是调用自己写的so,很少有调用别人so的情况,所以用绝对路径也未尝不可。
java jni一般都是调用自己写的so,很少有调用别人so的情况,所以用绝对路径也未尝不可。
|
如果是编译时-l 参数,文件名当然需要lib做前缀,因为编译器会去查找这样的一个名字。不过你此时是用System.load直接读取文件名,所以必须是完全匹配的名字,或者你在java代码里load文件全名,总之,这里二者名字要一致。