【问题标题】:Trying to call a function in C from Java using JNA尝试使用 JNA 从 Java 调用 C 中的函数
【发布时间】:2014-01-14 16:17:33
【问题描述】:

我用 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 库。如果你能给我一些关于如何解决这个问题的建议,那就太好了

【问题讨论】:

    标签: java c jna libspotify


    【解决方案1】:

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

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

    -L/path/to/spotify/library
    

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

    -I/path/to/spotify/includes
    

    【讨论】:

    • gcc -o libspot.so -L ~/Downloads/libspotify-12.1.51-Linux-i686-release/lib/ -L /usr/local/lib/ -I ~/Downloads/libspotify -12.1.51-Linux-i686-release/include/libspotify/ -shared jukebox.c appkey.c
    • 您还需要传入-Wl,-rpath,$HOME/Downloads/libspotify-12.151-Linux-i686-releases/lib,所以libspot.so 知道在那里寻找库。我倾向于不在路径名中使用~,因为评估规则非常有限
    • 嘿Petesh,谢谢你的评论,你能告诉我你提到的2个标志如何适合gcc编译命令,即gcc命令是什么样的?
    【解决方案2】:

    经过 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 的帮助 :)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-05-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多