System.loadLibrary在java 1.6上失败,但在java 1.5上工作

System.loadLibrary在java 1.6上失败,但在java 1.5上工作,java,java-native-interface,aix,Java,Java Native Interface,Aix,我在AIX6.1和SLES11上遇到了一个特殊的问题。我正在尝试使用System.loadLibrary()调用在Java中加载so文件。以下是示例程序: public class jniTest { public static void main(String[] args) { try { System.loadLibrary("libSample.so"); System.out.println("Loaded!!!

我在AIX6.1和SLES11上遇到了一个特殊的问题。我正在尝试使用
System.loadLibrary()
调用在Java中加载
so
文件。以下是示例程序:

public class jniTest
{ 

  public static void main(String[] args)
  {

      try
      {
         System.loadLibrary("libSample.so");
         System.out.println("Loaded!!!");
      }
      catch(UnsatisfiedLinkError e)
      {
         System.out.println("unsatisfiedlinkerror");
      }
}  
当我用Java1.5编译这段代码时,它工作正常。但是,当我用Java1.6编译它时,它会显示
unsatifiedlinkerror
。我不明白我怎么可能会犯这个错误。我的跑步方式是:

javac jniTest.java

java -Djava.library.path=. jniTest
so
文件位于运行代码的当前目录中。 在此之前,我尝试过的事情:

  • 给出绝对路径-不起作用

  • 使用
    Runtime.getRuntime().loadLibrary()
    -无效


  • 你知道我做错了什么吗?

    我不认为你在使用JNI时应该有“
    。所以
    ”扩展。尝试使用
    System.loadLibrary(“libSample”)

    仅扩展Jim所说的内容:您不需要.so扩展名或文件的“lib”部分。这应该有效(至少在1.6中对我有效):


    我想到的前三件事:

  • 确保库位于java库路径上(您已经完成了此操作)
  • 确保正确使用了
    System.loadLibrary()
    。如果您的库名为“libSample.so”,则调用应为
    System.loadLibrary(“Sample”)
    。(其他答复中也提出了这一点)
  • 考虑到OpenJDK下的库可能存在问题,您正在使用的是Java虚拟机。运行命令
    java-version
    ,如果响应的一部分类似于
    OpenJDK运行时环境(build 1.6.0_0-b11)
    ,请尝试安装正式的Sun JDK,看看是否有效

  • 另一种可能是Java中的本机函数与库中的函数不一致。JNI函数有一个非常明确的命名约定。 例如,如果您在java中有一个函数应该调用c/c++库函数:

    package my.packagename;
    
    public class Test {
    
        static {
            System.loadLibrary("Sample");
        }
    
        public native void testJNI(int arg1);
    }
    
    < > C或C++中的相应函数必须是(假设你的包名是“COM.PACGAGEName”):


    我之所以这样做,是因为如果函数名不匹配,就会抛出一个不满意的链接错误。

    当您使用1.5编译它,但使用1.6运行它时会发生什么?您是否检查了不满意的链接错误消息?它应该会给出问题的地方一些提示。可能已经找到了库,但Java 6无法加载。在SLES下,
    ldd libSample.so
    的结果是什么?我想AIX中没有ldd。一个可能的原因是libSample.so依赖于JSE 1.5 library.dump-Tv libSample.so将显示其依赖项并搜索path.gxx_gcc/g++内容。你的共享库是用gcc构建的吗?嗨,Jim,我试过了,但是没有成功,它仍然在说不满意的链接错误这已经晚了,但是对于任何阅读本文的人来说。必须使用
    loadLibrary
    的平台名称,即在本例中,平台名称应为
    Sample
    。该函数将添加
    lib
    和´。因此,`如果您运行的是linux或
    .dll
    ,如果您运行的是windows。您好,rm5248,也尝试了此函数,但对我不起作用。我使用的是AIX6.1。但同样的代码适用于Java1.5版本。Hi Rob,我使用的是官方的sun jdk,#/usr/java6/bin/java-version java version“1.6.0”java(TM)SE运行时环境(build pap3260-2007112301)IBM J9 VM(build 2.4,J2RE 1.6.0 IBM J9 2.4 AIX ppc-32 jvmap3260-2007112115015(支持JIT)J9VM-20071121_015015_bHdSMR JIT-r9_20071121_1330 GC-20071031_AA)JCL-20071118_01
    package my.packagename;
    
    public class Test {
    
        static {
            System.loadLibrary("Sample");
        }
    
        public native void testJNI(int arg1);
    }
    
    JNIEXPORT void JNICALL Java_my_packagename_Test_testJNI(JNIEnv* env, jobject obj, jint arg1) {
         // ... code here
    }