<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    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 閱讀(1818) 評論(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 凡客誠品專賣店
    阿克蘇開得久空間撒旦  回復  更多評論
      


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


    網站導航:
     
    主站蜘蛛池模板: 亚洲精品免费视频| 日本不卡视频免费| 亚洲爆乳无码专区| 国产精品免费观看视频| 亚洲国产V高清在线观看| 亚洲人成网站18禁止| 四虎成人免费观看在线网址| 亚洲天堂男人影院| 色播在线永久免费视频| 亚洲狠狠成人综合网| 日韩精品视频免费观看| 亚洲人成色777777老人头| 在线免费观看国产视频| 美女被爆羞羞网站在免费观看| 伊在人亚洲香蕉精品区麻豆| 一级黄色片免费观看| 久久久青草青青亚洲国产免观 | 成年人网站在线免费观看| 亚洲欧美日韩中文字幕一区二区三区 | 亚洲视频精品在线| 青青青国产在线观看免费网站| 亚洲女人初试黑人巨高清| 成人免费视频88| 欧亚一级毛片免费看| 久久精品亚洲视频| 丁香花免费完整高清观看| 亚洲欧美在线x视频| 中文字幕亚洲乱码熟女一区二区| 久久大香伊焦在人线免费| 亚洲免费在线视频观看| 国产免费看插插插视频| a级特黄毛片免费观看| 亚洲另类小说图片| 国产免费AV片无码永久免费| 久久www免费人成精品香蕉| 亚洲AV福利天堂一区二区三| 好吊妞998视频免费观看在线| 国产99久久久久久免费看| 亚洲日本香蕉视频| 亚洲国产婷婷香蕉久久久久久| 午夜老司机永久免费看片|