2013-03-20 32 views
1

我想,第一次本地方法....
我从这个链接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
Exception in thread "main" java.lang.UnsatisfiedLinkError: no nativetest in java.library.path at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1860)
at java.lang.Runtime.loadLibrary0(Runtime.java:845)
at java.lang.System.loadLibrary(System.java:1084)
at nativetest.(nativetest.java:4)

Thanx提前....

+0

加上'.'到'LD_LIBRARY_PATH'? – longhua 2013-03-20 05:34:14

+0

尝试将'nativetest.so'重命名为'libnativetest.so'。 – longhua 2013-03-20 05:54:35

+0

@lhuang感谢它的工作 – Rohit 2013-03-20 06:14:18

回答

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''.