0

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

4

2 回答 2

2

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

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

-L/path/to/spotify/library

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

-I/path/to/spotify/includes
于 2014-01-14T16:25:06.297 回答
-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 的帮助 :)

于 2014-01-15T08:55:07.410 回答