尝试使用JNA从Java调用C语言中的函数

时间:2014-01-14 16:17:33

标签: java c jna libspotify

我在C中编写了一些代码,我想用Java调用它。我所做的是我的c代码中有一个函数从libspotify调用另一个c函数,我试图用JNA编写一个Java Wrapper来调用我的c函数。

我已经为c中的spotify编写了一个简单的登录函数,它实际上正在工作。以下是该c文件的链接,该文件具有方法

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

我接下来的步骤是,不使用libspotify示例中提供的make文件,而是使用以下cmd编译并创建.so文件

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();
    }
}

以下是编译和运行java文件的命令

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代码中提供的C api),我在c代码中调用它,所以我想我当我尝试生成我的.so文件时,需要以某种方式链接libspotify库。如果你能就如何解决这个问题给我一些建议,那就太好了

2 个答案:

答案 0 :(得分:2)

您需要在spotify库中进行链接。

这应该在编译libspot.so时完成。这可以通过以下方式完成:

-L/path/to/spotify/library

这应该是something/libspotify/lib,,可能是您构建libspot.so的目录。您可能还需要指定:

-I/path/to/spotify/includes

答案 1 :(得分:-1)

经过2天的研究,这就是我如何使用它,以下是我用来生成.so文件的命令。

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

执行Java文件的其余步骤与上述相同。

感谢Erick Robertson和Petesh的帮助:)