2011-05-24 66 views
1

我編譯this library使用NDK到.so中。我可以用System.LoadLibary()成功加載它,但是當我嘗試庫的示例代碼時,它會拋出一個UnsatisfiedLinkError。我檢查了庫的源代碼,它確實具有我使用的函數以及相同的參數(JNIEnv和jobject除外)以及相同的返回值。另外,圖書館的創建者當然會分享工作示例代碼。那麼我做錯了什麼?我從頁面複製了確切的代碼,並相應地更改了變量名稱。使用本機庫時的UnsatisfiedLinkError

回答

0

沒有更多的細節,很難說。查看了該網站上的圖書館之後,可能會以不同的方式命名您的班級。您需要致電您的Java類Giffle,它必須位於包org.jiggawatt.giffle中。這不是一個命名約定,你會意外;-)

package org.jiggawatt.giffle; 

public class Giffle { 
    static { 
     System.loadLibrary("gifflen"); 
    } 

    public native int Init(String gifName, int w, int h, 
      int numColors, int quality, 
      int frameDelay); 
    public native void Close(); 
    public native int AddFrame(int[] inArray); 
} 

要使用它,你要麼做在Giffle類的叫聲,或可能是一個更清潔的方式是使用一個實例偶然發現:

Giffle giffle = new Giffle(); 
giffle.Init(...); 
giffle.AddFrame(...); 
giffle.Close(); 

似乎有點奇怪,Java部分不在zip中,尤其是因爲類名被硬編碼爲C符號。也許編寫它的人在Java部分有一大堆額外的代碼,他不希望任何人看到。

據我所知,C和C++代碼是完整的。你根本不需要修改它。本地方法的實現在gifflen.cpp中,並且有像Java_org_jiggawatt_giffle_Giffle_Init這樣的名稱。它們具有用於JNI調用約定的正確的本機端參數。

0

你是如何構建這個的?我發現每次運行ndk-build之後,我都必須在Eclipse中執行Project-> Clean ...以讓Eclipse獲取.so文件並將其複製到apk中。

相關問題