java - JNA: निर्दिष्ट प्रक्रिया नहीं मिली




api jni (2)

मैं यह जानने की कोशिश कर रहा था कि जेएनएनए कैसे काम करता है, इसलिए मैंने स्पोर्टीसीपी एपीआई (लिम्बोस्पोटाईफ़ 0.0.7) का उपयोग करने का निर्णय लिया। मैं अपना डीएलएल सही ढंग से लोड करने में कामयाब रहा, लेकिन फिर यह दिखता है कि मेरा कोड एपीआई में परिभाषित कोई विधि नहीं पा रहा है।

यहां मेरा कोड है:

मेरी मुख्य फाइल:

public class Test{
    private static final int SPOTIFY_API_VERSION = 7;
private static final char[] APP_KEY = { /* MY APP KEY HERE */ };

    static{
        System.loadLibrary("libspotify");
    }

    public static void main(String[] args){
    JLibspotify libs = JLibspotify.INSTANCE;

    sp_session mySession = new sp_session();
    sp_session_config cfg = new sp_session_config();
    cfg.api_version = SPOTIFY_API_VERSION;
    cfg.cache_location = "tmp";
    cfg.settings_location = "tmp";
    cfg.application_key = APP_KEY;
    cfg.application_key_size = APP_KEY.length;
    cfg.user_agent = "spshell";
    cfg.callbacks = null;

    libs.sp_session_create(cfg, mySession);
}
}

मेरा लाइब्रेरी इंटरफ़ेस:

public interface JLibspotify extends Library {  
    JLibspotify INSTANCE = (JLibspotify)Native.loadLibrary("libspotify", JLibspotify.class);

    // Methods definitions
    sp_error sp_session_create(sp_session_config config, sp_session sess);
}

मेरे sp_session ऑब्जेक्ट (अपारदर्शी C स्ट्रेट)

public class sp_session extends PointerType{
    public sp_session(Pointer address) {
        super(address);
    }
    public sp_session() {
        super();
    }
}

मेरे sp_session_config ऑब्जेक्ट

public class sp_session_config extends Structure{
    public int api_version; // The version of the Spotify API your application is compiled with.
    public String cache_location;
    public String settings_location;
    public char[] application_key}; // Your application key.
    public int application_key_size; // The size of the application key in bytes
    public String user_agent;
    public sp_session_callbacks callbacks; // Delivery callbacks for session events. NULL if not interested in any callbacks
    public Pointer userdata; // User supplied data for your application
    public boolean compress_playlists;
    public boolean dont_save_metadata_for_playlists;
    public boolean initially_unload_playlists;
}

मेरे sp_error enum

public enum sp_error {
    SP_ERROR_OK, 
    SP_ERROR_BAD_API_VERSION, 
    SP_ERROR_API_INITIALIZATION_FAILED, 
    SP_ERROR_TRACK_NOT_PLAYABLE, 
    SP_ERROR_RESOURCE_NOT_LOADED, 
    SP_ERROR_BAD_APPLICATION_KEY, 
    SP_ERROR_BAD_USERNAME_OR_PASSWORD, 
    SP_ERROR_USER_BANNED, 
    SP_ERROR_UNABLE_TO_CONTACT_SERVER, 
    SP_ERROR_CLIENT_TOO_OLD, 
    SP_ERROR_OTHER_PERMANENT, 
    SP_ERROR_BAD_USER_AGENT, 
    SP_ERROR_MISSING_CALLBACK, 
    SP_ERROR_INVALID_INDATA, 
    SP_ERROR_INDEX_OUT_OF_RANGE, 
    SP_ERROR_USER_NEEDS_PREMIUM, 
    SP_ERROR_OTHER_TRANSIENT, 
    SP_ERROR_IS_LOADING, 
    SP_ERROR_NO_STREAM_AVAILABLE, 
    SP_ERROR_PERMISSION_DENIED, 
    SP_ERROR_INBOX_IS_FULL, 
    SP_ERROR_NO_CACHE, 
    SP_ERROR_NO_SUCH_USER
}

मेरा अपवाद स्टैक ट्रेस

Exception in thread "main" java.lang.UnsatisfiedLinkError: Error looking up function 'sp_session_create': The specified procedure could not be found.

at com.sun.jna.Function.<init>(Function.java:129)
at com.sun.jna.NativeLibrary.getFunction(NativeLibrary.java:250)
at com.sun.jna.Library$Handler.invoke(Library.java:191)
at $Proxy0.sp_session_create(Unknown Source)
at com.nbarraille.jspotify.main.Test.main(Test.java:49)

सी + + विधि को चलाने की कोशिश कर रहा हूँ

/**
 * Initialize a session. The session returned will be initialized, but you will need
 * to log in before you can perform any other operation
 *
 * Here is a snippet from \c spshell.c:
 * @dontinclude spshell.c
 * @skip config.api_version
 * @until }
 *
 * @param[in]   config    The configuration to use for the session
 * @param[out]  sess      If successful, a new session - otherwise NULL
 *
 * @return                One of the following errors, from ::sp_error
 *                        SP_ERROR_OK
 *                        SP_ERROR_BAD_API_VERSION
 *                        SP_ERROR_BAD_USER_AGENT
 *                        SP_ERROR_BAD_APPLICATION_KEY
 *                        SP_ERROR_API_INITIALIZATION_FAILED
 */
SP_LIBEXPORT(sp_error) sp_session_create(const sp_session_config *config, sp_session **sess);

    By the way, I don't have access to the definition of the sp_artist structure in C, I just reconstructed it based on the methods offered by the API, could it be the problem?

यदि आपके पास इसकी पहुंच नहीं है, तो जेएनए नहीं है यदि यह एक अपारदर्शी प्रकार है, तो इसे बनाने, संशोधित करने और हटाने के लिए फ़ंक्शन देखें।

इसके अलावा, क्या आपको पूर्ववर्ती वक्तव्य पर एक त्रुटि मिली, जावा चर "कलाकार" की पांच पंक्ति की परिभाषा?


अंत में मुझे विलंबता वाकर के साथ libspotify.dll खोलकर समाधान मिला: संकलक ने विधि नाम (एक अंडरस्कोर उपसर्ग और एक @ 4 या @ 8 प्रत्यय) में कुछ अतिरिक्त जानकारी जोड़ा।

मुझे करना पड़ा:

  • फंक्शनमैपर के कार्यान्वयन को बनाने से वास्तविक नाम के अनुसार मेरे सभी तरीकों का नाम बदल दिया गया (निर्भरता वाकर में उपलब्ध)
  • विकल्प मैप में इस मैपर के एक उदाहरण के साथ मेरी लाइब्रेरी को तुरंत स्थापित करें।






jna