免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 6772 | 回复: 5
打印 上一主题 下一主题

请教Linux下JNI调用时找不到库文件的问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2006-08-04 14:50 |只看该作者 |倒序浏览
我参考了core java 2一书本地方法章节上的代码,各个源代码都通过了编译,但是在运行的时候报错:
        
我认为问题是对C代码进行编译时候的参数路径设置错误,或生成库文件后的存放位置不对,请大家帮忙分析一下,谢谢。

所有的源代码和生成的文件都放在同一个目录/home/JNI下,下面是测试环境:
操作系统:SUSE linux 10,
c编译器版本:cc (GCC) 4.0.2 20050901 (prerelease) (SUSE Linux)
java编译器版本:java version "1.4.2_06"
JAVA_HOME=/usr/lib/jvm/java

论坛徽章:
0
2 [报告]
发表于 2006-08-04 14:52 |只看该作者
源代码如下:
HelloNative.java
class HelloNative
{
    static
    {
        System.loadLibrary("HelloNative");
    }
    public native static void greeting();
}

HelloNative.h(由javah HelloNative自动产生)
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class HelloNative */

#ifndef _Included_HelloNative
#define _Included_HelloNative
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class:     HelloNative
* Method:    greeting
* Signature: ()V
*/
JNIEXPORT void JNICALL Java_HelloNative_greeting
  (JNIEnv *, jclass);

#ifdef __cplusplus
}
#endif
#endif

HelloNative.c
#include "HelloNative.h"
#include <stdio.h>

JNIEXPORT void JNICALL Java_HelloNative_greeting(JNIEnv* env, jclass cl)
{
    printf("Hello, Native World!\n");
}

HelloNativeTest.java
class HelloNativeTest
{
    public static void main(String args[])
    {
        HelloNative.greeting();
    }
}

论坛徽章:
0
3 [报告]
发表于 2006-08-04 14:53 |只看该作者
第一次运行

在shell下编译HelloNative.c:
cc -c -I/usr/lib/jvm/java/include -I/usr/lib/jvm/java/include/linux HelloNative.c -o libHelloNative.so
生成libHelloNative.so文件

运行java HelloNativeTest,结果报错如下:
Exception in thread "main" java.lang.UnsatisfiedLinkError: no HelloNative in java.library.path
        at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1517)
        at java.lang.Runtime.loadLibrary0(Runtime.java:788)
        at java.lang.System.loadLibrary(System.java:834)
        at HelloNative.<clinit>(HelloNative.java:6)
        at HelloNativeTest.main(HelloNativeTest.java:5)

论坛徽章:
0
4 [报告]
发表于 2006-08-04 14:54 |只看该作者
第二次运行:

鉴于上面的报错信息,我写了一个查看java.library.path内容
TestPath.java
public class TestPath
{
    public static void main(String args[])
    {
        System.out.println(System.getProperty("java.library.path"));
    }
}

运行TestPath,结果显示:
/usr/lib/jvm/java-1.4.2-sun-1.4.2.06/jre/lib/i386/client:/usr/lib/jvm/java-1.4.2-sun-1.4.2.06/jre/lib/i386:/usr/lib/jvm/java-1.4.2-sun-1.4.2.06/jre/../lib/i386        

将生成的libHelloNative.so文件拷贝到上面的目录下,并执行ldconfig后,再执行java HelloNativeTest,结果报错如下:
Exception in thread "main" java.lang.UnsatisfiedLinkError: /usr/lib/jvm/java-1.4.2-sun-1.4.2.06/jre/lib/i386/libHelloNative.so: /usr/lib/jvm/java-1.4.2-sun-1.4.2.06/jre/lib/i386/libHelloNative.so: only ET_DYN and ET_EXEC can be loaded
        at java.lang.ClassLoader$NativeLibrary.load(Native Method)
        at java.lang.ClassLoader.loadLibrary0(ClassLoader.java:1586)
        at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1503)
        at java.lang.Runtime.loadLibrary0(Runtime.java:788)
        at java.lang.System.loadLibrary(System.java:834)
        at HelloNative.<clinit>(HelloNative.java:5)
        at HelloNativeTest.main(HelloNativeTest.java:5)
        
请大家给分析一下,看看问题到底出在什么地方,先谢谢了!

论坛徽章:
0
5 [报告]
发表于 2006-08-04 15:54 |只看该作者
上述问题已经解决,原因是因为没有设置LD_LIBRARY_PATH,在shell环境中执行export LD_LIBRARY_PATH=/home/JNI,上述问题就迎刃而解。core java 2一书中的编译环境是在solaris下,所以环境变量的设置不同。

论坛徽章:
0
6 [报告]
发表于 2006-08-05 21:59 |只看该作者
各种系统下的环境用法还可能不一样啊。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP