BirdsHover

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

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

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

          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

          下面是簡單的實現(xiàn)
          #include "TestDLL.h"

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

          在linux下通過gcc編譯后,java調(diào)用:
          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后,能夠調(diào)用正常。

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


          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后,能夠調(diào)用正常。

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

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

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

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

          # re: 一個JNI的問題請教 2010-04-29 09:22 jacky_zz
          問題是在Windows用gcc編譯的時候,如果沒有指定用參數(shù)編譯為Windows平臺的dll,那么gcc會在導出符號前加下劃線“_”,這樣在Windows下就不能找到對應的導出符號了,所以你需要在編譯的時候指定參數(shù):
          -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參數(shù)要帶絕對路徑,且文件要有后綴  回復  更多評論
            

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


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


          網(wǎng)站導航:
           
          主站蜘蛛池模板: 昭平县| 陆丰市| 新巴尔虎左旗| 自贡市| 桑日县| 军事| 博乐市| 汕尾市| 兰溪市| 于田县| 新沂市| 临颍县| 麻江县| 独山县| 玉溪市| 三穗县| 理塘县| 河源市| 鱼台县| 丹寨县| 邵东县| 正阳县| 新密市| 吉安市| 河曲县| 板桥市| 稻城县| 兴化市| 辛集市| 广元市| 金门县| 邯郸县| 怀集县| 正蓝旗| 双柏县| 阿拉善左旗| 万源市| 泗洪县| 桂阳县| 遂宁市| 吉木萨尔县|