我在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库。如果你能就如何解决这个问题给我一些建议,那就太好了
答案 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的帮助:)