Wrapper JNI che si lamenta di riferimenti non definiti

Adrijan 07/27/2017. 0 answers, 39 views
android android c android-ndk android-ndk cmake jni

Sto cercando di utilizzare la libreria TagLib in un'app Android. Per quanto ne so, devo scrivere un wrapper JNI per questo. Volevo provare qualcosa di semplice - leggi il titolo dal tag.

Ho scritto il seguente codice in Java:

package developer.rogan.taglib;

import android.support.annotation.NonNull;
import android.util.Log;

public class TagJNI {

    private static final String TAG = "TagJNI";

    private String filename;
    private String title;

    public TagJNI(@NonNull String filename) {
        this.filename = filename;
    }

    public String getTitle() {
        Log.d(TAG, "getTitle, filename = " + filename);
        this.title = taglibGetTitle(filename);
        return title;
    }

    private native String taglibGetTitle(String filename);
} 

Android Studio mi ha dato quindi la possibilità di generare automaticamente la funzione nel codice nativo (il file si chiama tagjni.c). Ho aggiunto un po 'del mio codice per aggiungere funzionalità:

#include #include "../../../../../../Development/C++/taglib-1.11.1/bindings/c/tag_c.h"

TagLib_File *file;
TagLib_Tag *tag;
char *title;

JNIEXPORT jstring JNICALL
Java_developer_rogan_taglib_TagJNI_taglibGetTitle(JNIEnv *env, jobject instance,
                                                  jstring filename_) {

    taglib_set_strings_unicode(JNI_FALSE);
    const char *filename = (*env)->GetStringUTFChars(env, filename_, 0);

    file = taglib_file_new(filename);
    tag = taglib_file_tag(file);
    title = taglib_tag_title(tag);
    taglib_file_free(file);
    (*env)->ReleaseStringUTFChars(env, filename_, filename);
    return (*env)->NewStringUTF(env, title);
} 

Sta succedendo qualcosa anche con la dichiarazione di inclusione. Posso scrivere #include e poi l'altro include che è inutilizzato. Tuttavia, quando lo elimino, nessuna delle variabili viene più riconosciuta. Quando passo il mouse sugli errori, ottengo la possibilità di aggiungere il #include.

Quando provo a eseguire l'app, ottengo il seguente errore (e alcuni più simili): riferimento non definito a "taglib_set_strings_unicode"

Questo significa che la funzione che sto chiamando non può essere trovata? Ho avuto un sacco di problemi nell'impostare la libreria e finalmente l'ho fatta funzionare in qualche modo. Quando ho iniziato a scrivere il wrapper JNI, Android Studio si è lamentato del fatto che il file .c non fosse incluso nel progetto. Dopo aver consultato la pagina Web NDK, ho pensato di dover creare un root CMakeLists.txt e fare riferimento agli altri due (uno per TagLib e uno per il wrapper JNI). So molto poco di C e di CMakeLists. Questo è quello che mi è venuto in mente:

cmake_minimum_required(VERSION 3.4.1)

add_subdirectory( # Specifies the directory of the CMakeLists.txt file.
                  /home/adrijan/Development/C++/taglib-1.11.1
                  # Specifies the directory for the build outputs.
                  /home/adrijan/devel/tagtest/taglib/src/main/cpp )
add_library( taglib SHARED IMPORTED )

add_subdirectory( # Specifies the directory of the CMakeLists.txt file.
                  /home/adrijan/devel/tagtest/taglib/src/main/jni
                  # Specifies the directory for the build outputs.
                  /home/adrijan/devel/tagtest/taglib ) 

TagLib include già un CMakeLists, quindi ho appena indicato. Per il wrapper JNI, ho inserito CMakeLists.txt all'interno della directory in cui si trova il codice:

cmake_minimum_required(VERSION 3.4.1)

# Specifies a library name, specifies whether the library is STATIC or
# SHARED, and provides relative paths to the source code. You can
# define multiple libraries by adding multiple add.library() commands,
# and CMake builds them for you. When you build your app, Gradle
# automatically packages shared libraries with your APK.

add_library( # Specifies the name of the library.
             jni-taglib

             # Sets the library as a shared library.
             SHARED

             # Provides a relative path to your source file(s).
             tagjni.c )

# Specifies a path to native header files.
include_directories(tagjni.h) 

Mi sembra che mi manchi qualcosa di molto ovvio qui. Credo che debba fare qualcosa con il modo in cui ho creato CMake, ma non riesco a capirlo.

No Answers Yet

Related questions

Hot questions

Language

Popular Tags