本机方法链接错误

时间:2013-03-20 05:29:22

标签: java dll native-methods

我第一次尝试原生方法.... 我从这个链接Click ....

进行了一个简单的编程
               nativetest.java
         public class nativetest
         {
            static {
              System.loadLibrary("nativetest");
            }
            public native String sayHello(String s);
            public static void main(String[] argv)
            {
                 String retval = null;
                 nativetest nt = new nativetest();
                 retval = nt.sayHello("Beavis");
                 System.out.println("Invocation returned " + retval);
            }

         }
  

javac nativetest.java
  javah -jni nativetest

已成功创建nativetest.h文件

                  nativetest.h
          /* DO NOT EDIT THIS FILE - it is machine generated */
          #include <jni.h>
          /* Header for class nativetest */

          #ifndef _Included_nativetest
          #define _Included_nativetest
          #ifdef __cplusplus
          extern "C" {
          #endif
          /*
           * Class:     nativetest
           * Method:    sayHello
           * Signature: (Ljava/lang/String;)Ljava/lang/String;
          */
          JNIEXPORT jstring JNICALL Java_nativetest_sayHello(JNIEnv *, jobject, jstring);

          #ifdef __cplusplus
          }
          #endif
     #endif

nativetest.c代码

                          nativetest.c 
          include "nativetest.h"    /*double quotes tells it to search current directory*/

          JNIEXPORT jstring JNICALL Java_nativetest_sayHello (JNIEnv *env, jobject thisobject, jstring js)

          {
               return js;
          }
  

gcc -I / usr / java / jdk1.7.0_13 / include -I / usr / java / jdk1.7.0_13 / include / linux -o nativetest.so -shared nativetest.c

已创建成功的共享对象文件。

当我执行nativetest时,它显示以下错误

  

java -Djava.library.path =。 nativetest
  线程“main”中的异常java.lang.UnsatisfiedLinkError:java.library.path中没有nativetest       在java.lang.ClassLoader.loadLibrary(ClassLoader.java:1860)
      在java.lang.Runtime.loadLibrary0(Runtime.java:845)
      在java.lang.System.loadLibrary(System.java:1084)
      在nativetest。(nativetest.java:4)

提前完成了......

1 个答案:

答案 0 :(得分:1)

在Linux上,共享库的文件名应以“lib”开头,即“lib [library_name] .so”。

参考:3.1.1. Shared Library Names

Every shared library has a special name called the ``soname''. The soname has the prefix ``lib'', the name of the library, the phrase ``.so'', followed by a period and a version number that is incremented whenever the interface changes (as a special exception, the lowest-level C libraries don't start with ``lib''). A fully-qualified soname includes as a prefix the directory it's in; on a working system a fully-qualified soname is simply a symbolic link to the shared library's ``real name''.