JNI wrapper klagar på odefinierade referenser

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

Jag försöker använda TagLib-biblioteket i en Android-app. Såvitt jag vet måste jag skriva ett JNI-omslag för det. Jag ville prova något enkelt - läs titeln från taggen.

Jag skrev följande kod i 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 gav mig sedan möjligheten att automatiskt generera funktionen i inbyggd kod (filen heter tagjni.c). Jag lade till en del av min egen kod för att lägga till funktionalitet:

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

Det finns något som händer med inkludera uttalandet också. Jag kan skriva #include och sedan innehåller den andra att den är oanvänd. Men när jag tar bort det, känns ingen av variablerna igen. När jag svävar över felen får jag möjlighet att lägga till #include.

När jag försöker köra appen får jag följande fel (och lite mer liknande): odefinierad referens till 'taglib_set_strings_unicode'

Betyder det att den funktion jag ringer inte kan hittas? Jag hade många problem att ställa upp biblioteket och äntligen fick det att fungera på något sätt. När jag började skriva JNI-omslaget, klagade Android Studio om .c-filen inte ingick i projektet. Efter att ha tittat på NDK-webbsidan tänkte jag att jag måste skapa en rutt CMakeLists.txt och referera de andra två (en för TagLib och en för JNI wrapper). Jag vet väldigt lite om C och CMakeLists. Detta är vad jag kom med:

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 innehåller redan en CMakeLists så jag bara pekade på det. För JNI-omslaget lade jag CMakeLists.txt in i katalogen där koden är:

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) 

Det verkar som om jag saknar något som är väldigt uppenbart här. Jag tror att det måste göra något med det sätt jag ställer upp CMake på, men jag kan inte räkna ut det.

No Answers Yet

Related questions

Hot questions

Language

Popular Tags