我已经用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
我不确定这里出了什么问题,但我的想法是,我在C代码中调用了libspotify(spotify提供的C api)中的sp_session_create函数,所以我认为当我试图生成.so文件时,我需要以某种方式链接libspotif库。如果你能给我一些关于如何解决这个问题的建议,那就太好了
您需要在spotify库中进行链接
这应该在编译libspot.so时完成
-L/path/to/spotify/library
这应该是something/libspotify/lib,
,很可能是您构建libspot.so
的目录。您可能还需要指定:
-I/path/to/spotify/includes
经过两天的研究,这就是我如何让它工作的,下面是我用来生成.so文件的命令。
gcc -L~/Downloads/libspotify-12.1.51-Linux-i686-release/lib -shared appkey.c jukebox.c -lspotify -o libspot.so
执行到Java文件的其余步骤与上面相同。
感谢Erick Robertson和Petersh的帮助:)