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

时间:2011-07-14 14:25:44

标签: java java-native-interface aix

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

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");
      }
}  

当我用Java 1.5编译这段代码时,它可以正常工作。但是当我用Java 1.6编译它时,它说UnsatisfiedLinkError。我不明白我怎么可能得到这个错误。我正在运行的方式是:

javac jniTest.java

java -Djava.library.path=. jniTest

so文件位于我运行代码的当前目录中。 在此之前,我尝试过的事情:

  1. 给出绝对路径 - 没有用

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

  3. 知道我做错了吗?

4 个答案:

答案 0 :(得分:2)

在使用JNI时,我认为您不应该使用“.so”扩展名。只需System.loadLibrary("libSample");

即可

答案 1 :(得分:0)

只是为了扩展Jim所说的内容:你不需要.so扩展名或文件的'lib'部分。这应该有效(至少,它适用于1.6):

  try
  {
     System.loadLibrary("Sample");
     System.out.println("Loaded!!!");
  }
  catch(UnsatisfiedLinkError e)
  {
     System.out.println("unsatisfiedlinkerror");
  }

答案 2 :(得分:0)

我想到的前三件事:

  1. 确保库位于java lib路径上(您已完成此操作)
  2. 确保您正确使用System.loadLibrary()。如果您的库名为“libSample.so”,则调用应为System.loadLibrary("Sample")。 (这已在其他答案中提出)
  3. 考虑到OpenJDK下的库可能存在问题,那就是您正在使用的Java VM。运行命令java -version,如果部分响应类似于OpenJDK Runtime Environment (build 1.6.0_0-b11),请尝试安装官方Sun JDK,看看是否有效。

答案 3 :(得分:0)

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

package my.packagename;

public class Test {

    static {
        System.loadLibrary("Sample");
    }

    public native void testJNI(int arg1);
}

c或c ++中的相应函数必须是(假设你的包名是“com.packagename”):

JNIEXPORT void JNICALL Java_my_packagename_Test_testJNI(JNIEnv* env, jobject obj, jint arg1) {
     // ... code here
}

我经历过的原因是,如果函数名称不匹配,则抛出UnsatisfiedLinkError。