BirdsHover

          ——路漫漫其修遠兮,吾將上下而爬樓梯!

            BlogJava :: 首頁 ::  :: 聯系 :: 聚合  :: 管理 ::
            21 隨筆 :: 8 文章 :: 34 評論 :: 0 Trackbacks
          這個問題比較急,借用首頁發一下,謝謝!

          最近需要對一個C++庫進行封裝,為簡單起見決定使用JAVA對其封裝。但是一直調用不成功,于是寫了一段測試代碼測試一下。為簡單起見,就使用默認包了。

          public class TestDLL {
              
          public native String Test(String put);
              
              
          static{
                  System.loadLibrary(
          "testdll");
              }
              
              
          public static void main(String[] args) {    
                  TestDLL test 
          = new TestDLL();
                  System.out.println(test.Test(
          new Date().toString()));
              }
          }

          然后生成了C++頭文件

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

          #ifndef _Included_TestDLL
          #define _Included_TestDLL
          #ifdef __cplusplus
          extern "C" {
          #endif
          /*
           * Class:     TestDLL
           * Method:    Test
           * Signature: (Ljava/lang/String;)Ljava/lang/String;
           
          */
          JNIEXPORT jstring JNICALL Java_TestDLL_Test
            (JNIEnv 
          *, jobject, jstring);

          #ifdef __cplusplus
          }
          #endif
          #endif

          下面是簡單的實現
          #include "TestDLL.h"

          JNIEXPORT jstring JNICALL Java_TestDLL_Test
            (JNIEnv 
          *, jobject, jstring put){
                
          return put;
          }

          在linux下通過gcc編譯后,java調用:
          java -Djava.library.path=/home/xp -cp . TestDLL

          一直報錯:

          Exception in thread "main" java.lang.UnsatisfiedLinkError: no testdll in java.library.path
                  at java.lang.ClassLoader.loadLibrary(ClassLoader.java:
          1734)
                  at java.lang.Runtime.loadLibrary0(Runtime.java:
          823)
                  at java.lang.System.loadLibrary(System.java:
          1028)
                  at TestDLL.main(TestDLL.java:
          27)

          但是我在windows下編譯了testdll.dll后,能夠調用正常。

          接著我改寫為System.load("/home/xp/testdll.so");結果可以在linux使用了,希望有經驗的朋友可以解答我的疑問。


          posted on 2010-04-28 18:11 Birdshover 閱讀(1825) 評論(8)  編輯  收藏

          評論

          # re: 一個JNI的問題請教 2010-04-28 19:04 美食天下
          學習中...  回復  更多評論
            

          # re: 一個JNI的問題請教 2010-04-28 20:00
          在Linux下是so文件,沒有dll文件的概念的。
          dll是只在windows下使用的。】

          所以在Windows下編譯成dll文件,而在Linux下需要編譯成so文件。

          應該是這樣的。我還沒寫過jni呢,倒是用了挺多的。。。。  回復  更多評論
            

          # re: 一個JNI的問題請教 2010-04-28 20:04 kalman03

          “但是我在windows下編譯了testdll.dll后,能夠調用正常。

          接著我改寫為System.load("/home/xp/testdll.so");結果可以在 linux使用了”

          在windows上和linux上都正常,還有什么問題?
          難道是樓上說的情況?  回復  更多評論
            

          # re: 一個JNI的問題請教 2010-04-28 20:13 隔葉黃鶯
          不需要寫 .dll 還是 so,程序會根據平臺決定是哪一類型文件
          還就是要了解動態庫會依次從哪里找,
          一般是 當前目錄,系統目錄,環境中的 LIB 目錄  回復  更多評論
            

          # re: 一個JNI的問題請教 2010-04-29 08:58 香草
          別說你是用Win環境的C編輯器得到的文件放在linux下運行 ?  回復  更多評論
            

          # re: 一個JNI的問題請教 2010-04-29 09:22 jacky_zz
          問題是在Windows用gcc編譯的時候,如果沒有指定用參數編譯為Windows平臺的dll,那么gcc會在導出符號前加下劃線“_”,這樣在Windows下就不能找到對應的導出符號了,所以你需要在編譯的時候指定參數:
          -Wl,--add-stdcall-alias和-Wl,--kill-at來去掉導出符號前的下劃線,以及導出符號中的@字符。  回復  更多評論
            

          # re: 一個JNI的問題請教 2010-04-29 20:44

          @隔葉黃鶯
          像這位達人所說的。可以不用寫dll和so也可以。
          Java有兩種方法加載:
          System.load和System.loadLibrary
          后面那個方法只要寫你的文件名就可以了如:System.loadLibrary(testdll) ——沒有后綴的。記得把testdll那個文件放到path目錄下
          System.load參數要帶絕對路徑,且文件要有后綴  回復  更多評論
            

          # re: 一個JNI的問題請教 2010-04-30 12:10 凡客誠品專賣店
          阿克蘇開得久空間撒旦  回復  更多評論
            


          只有注冊用戶登錄后才能發表評論。


          網站導航:
           
          主站蜘蛛池模板: 类乌齐县| 简阳市| 镇原县| 大洼县| 洛川县| 绥德县| 宁夏| 元江| 宜宾县| 胶南市| 昌吉市| 瓦房店市| 申扎县| 诸暨市| 崇州市| 油尖旺区| 苗栗市| 三河市| 望都县| 和静县| 方山县| 宁国市| 潞西市| 自贡市| 射阳县| 洛浦县| 揭阳市| 玉山县| 探索| 扶沟县| 温州市| 桐梓县| 高碑店市| 当雄县| 偏关县| 略阳县| 延长县| 曲松县| 盐津县| 博白县| 盈江县|