JNI-wrapper klaagt over ongedefinieerde verwijzingen

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

Ik probeer de TagLib-bibliotheek in een Android-app te gebruiken. Voor zover ik weet, moet ik er een JNI-wrapper voor schrijven. Ik wilde iets eenvoudigs proberen - lees de titel van de tag.

Ik schreef de volgende code 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 gaf me vervolgens de optie om de functie automatisch te genereren in native code (het bestand heet tagjni.c). Ik heb een deel van mijn eigen code toegevoegd om functionaliteit toe te voegen:

#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);
} 

Er is ook iets aan de hand met de include-verklaring. Ik kan #include schrijven en de andere include zegt dat het ongebruikt is. Wanneer ik het echter verwijder, wordt geen van de variabelen meer herkend. Wanneer ik over de fouten zweef, krijg ik de optie om #include toe te voegen.

Wanneer ik de app probeer uit te voeren, krijg ik de volgende foutmelding (en enkele meer vergelijkbare): ongedefinieerde verwijzing naar 'taglib_set_strings_unicode'

Betekent dit dat de functie die ik aanroep niet kan worden gevonden? Ik had veel problemen met het instellen van de bibliotheek en eindelijk op de een of andere manier werken. Toen ik begon met het schrijven van de JNI-wrapper, klaagde Android Studio erover dat het .c-bestand niet in het project was opgenomen. Na het bekijken van de NDK-webpagina dacht ik dat ik één root-CMakeLists.txt moest maken en naar de andere twee moest verwijzen (een voor TagLib en een voor JNI-wrapper). Ik weet heel weinig over C en CMakeLists. Dit is wat ik bedacht:

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 bevat al een CMakeLists dus ik wees er gewoon op. Voor de JNI-wrapper heb ik CMakeLists.txt in de map geplaatst waar de code is:

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) 

Het lijkt mij dat ik hier iets heel duidelijk mis. Ik geloof dat het iets moet doen met de manier waarop ik CMake opzet, maar ik kan er niet achter komen.

No Answers Yet

Related questions

Hot questions

Language

Popular Tags