2014-01-14 34 views
0

我已經用C語言編寫一些代碼,我想從Java調用從Java調用的函數℃。我所做的是我有一個函數在我的c代碼中調用另一個c函數從libspotify我試圖寫一個Java包裝使用JNA調用我的c函數。試圖使用JNA

我寫了一個簡單的登錄功能,在C Spotify的這實際上是工作。下面是將c文件的鏈接,其具有的方法

https://github.com/shroffrushabh/libspotify_java/blob/master/jukebox.c

下一步我之後,而不是使用在libspotify實施例中提供的補充文件,我使用了以下cmd以編譯和創建。因此文件

gcc -o libspot.so -shared jukebox.c appkey.c 

這是我的java文件的樣子

import com.sun.jna.Library; 
import com.sun.jna.Native; 

public class SpotifyTest { 
    public interface JukeBox extends Library { 
     public int login(); 
    } 
    static public void main(String argv[]) { 
     JukeBox jk = (JukeBox) Native.loadLibrary("spot", JukeBox.class); 
     jk.login(); 
    } 
} 

以下是編譯和運行JA的命令VA文件

javac -classpath jna-4.0.0.jar SpotifyTest.java 
java -classpath jna-4.0.0.jar:. SpotifyTest 

以下是例外,我得到:

java.lang.UnsatisfiedLinkError: /home/rushabh/libctest.so: undefined symbol: sp_session_create 

我不知道是怎麼回事錯在這裏,但這裏是我在想什麼,有在libspotify一個sp_session_create功能( C API),我正在調用我的C代碼,所以我想我需要以某種方式鏈接libspotify庫,當我試圖生成我的.so文件。這將是巨大的,如果你能給我如何解決這個問題

回答

-1

後第2天研究這個的是我得到了它的工作,下面是我用來生成.so文件的命令。

gcc -L~/Downloads/libspotify-12.1.51-Linux-i686-release/lib -shared appkey.c jukebox.c -lspotify -o libspot.so 

執行到Java文件的其餘步驟與上面相同。

謝謝埃裏克·羅伯遜和Petesh您的幫助:)

2

您需要在Spotify的庫鏈接一些建議。

這應該當你編譯libspot.so來完成。這是可以做到的:

-L/path/to/spotify/library 

這應該是something/libspotify/lib,,並有可能在那裏你建libspot.so的目錄。您可能還需要指定:

-I/path/to/spotify/includes 
+0

的gcc -o libspot.so -L〜/下載/ libspotify - 51年1月12日,Linux的的i686-release/lib目錄/ -L在/ usr /本地/ lib目錄/ -I〜/下載/ libspotify - 51年1月12日,Linux的i686的釋放/包括/ libspotify/-shared jukebox.c appkey.c – user1386101

+0

我試着用上面的命令,但它仍然沒有工作。 – user1386101

+0

你需要在'-Wl,-rpath,$ HOME /下載/ libspotify-12.151-Linux的i686的發佈版/ lib'以及傳遞的,所以'libspot.so'知道如何尋找那裏的圖書館。由於評估規則非常有限,我傾向於不在路徑名中使用'〜' – Petesh