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



我已经用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的帮助:)

相关内容

  • 没有找到相关文章

最新更新