JNA: не удается найти методы C в Spotify API - PullRequest
1 голос
/ 28 февраля 2011

Я пытался узнать, как работает JNA, поэтому я решил использовать API spotify (libspotify 0.0.7). Мне удалось правильно загрузить мою dll, но тогда похоже, что мой код не находит ни один из методов, определенных в API.

Вот мой тестовый код:

public class Test { 
    static{
        System.loadLibrary("libspotify");
    }

    public interface LibSpotify extends Library {
        public static class sp_artist extends Structure{
            public String name;
            public boolean isLoaded;
            public int refCount;
        };

        LibSpotify INSTANCE = (LibSpotify)Native.loadLibrary("libspotify", LibSpotify.class);

        public String sp_artist_name(sp_artist artist);
    }

    public static void main(String[] args){
        LibSpotify ls = LibSpotify.INSTANCE;

        LibSpotify.sp_artist artist = new LibSpotify.sp_artist(){
            String name = "thename";
            boolean isLoaded = false;
            int refCount = 0;
        };

        ls.sp_artist_name(artist);
    }
}

Вот описание C метода, к которому я пытаюсь получить доступ, в файле api.h libspotify:

/**
 * Return name of artist
 *
 * @param[in]   artist     Artist object
 *
 * @return                 Name of artist.
 *                         Returned string is valid as long as the artist object stays allocated
 *                         and no longer than the next call to sp_session_process_events()
 */
SP_LIBEXPORT(const char *) sp_artist_name(sp_artist *artist);

А вот и мой StackTrace:

* * 1010

Есть ли проблема с моей DLL, или я что-то не так делаю?

Кстати, у меня нет доступа к определению структуры sp_artist в C, я просто реконструировал ее на основе методов, предлагаемых API, это может быть проблемой?

/**
 * @defgroup artist Artist subsystem
 * @{
 */

/**
 * Return name of artist
 *
 * @param[in]   artist     Artist object
 *
 * @return                 Name of artist.
 *                         Returned string is valid as long as the artist object stays allocated
 *                         and no longer than the next call to sp_session_process_events()
 */
SP_LIBEXPORT(const char *) sp_artist_name(sp_artist *artist);

/**
 * Check if the artist object is populated with data
 *
 * @param[in]   artist     An artist object
 *
 * @return                 True if metadata is present, false if not
 *
 */
SP_LIBEXPORT(bool) sp_artist_is_loaded(sp_artist *artist);


/**
 * Increase the reference count of a artist
 *
 * @param[in]   artist       The artist object
 */
SP_LIBEXPORT(void) sp_artist_add_ref(sp_artist *artist);

/**
 * Decrease the reference count of a artist
 *
 * @param[in]   artist       The artist object
 */
SP_LIBEXPORT(void) sp_artist_release(sp_artist *artist);

/** @} */

Спасибо!

1 Ответ

0 голосов
/ 02 марта 2011

I наконец-то нашел решение, открыв libspotify.dll с помощью Dependency Walker: компилятор добавил некоторую дополнительную информацию к имени метода (префикс подчеркивания и суффикс @ 4 или @ 8).

Мне пришлось:

  • Создать реализацию FunctionMapper, которая переименовала все мои методы в соответствии с реальными именами (доступно в Dependency Walker)
  • Создание экземпляра моей библиотеки с помощью экземпляраэтого картографа в карте параметров.
...