JNI wrapper klager over undefined referencer

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

Jeg forsøger at bruge TagLib-biblioteket i en Android-app. Så vidt jeg ved, må jeg skrive en JNI wrapper til det. Jeg ville prøve noget simpelt - læs titlen fra tagget.

Jeg skrev følgende kode 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 derefter muligheden for automatisk at generere funktionen i indbygget kode (filen hedder tagjni.c). Jeg tilføjede en del af min egen kode for at tilføje 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);
} 

Der er også noget der foregår med inkluderingserklæringen. Jeg kan skrive #include og så den anden omfatter, at det er ubrugt. Men når jeg sletter det, er ingen af ​​variablerne igen anerkendt. Når jeg svæver over fejlene, får jeg mulighed for at tilføje #include.

Når jeg forsøger at køre appen, får jeg følgende fejl (og nogle mere lignende): Udefineret reference til 'taglib_set_strings_unicode'

Betyder det, at den funktion jeg ringer ikke kan findes? Jeg havde mange problemer med at opsætte biblioteket og endelig fik det til at fungere på en eller anden måde. Da jeg begyndte at skrive JNI-wrapper, klagede Android Studio om .c-filen, der ikke var medtaget i projektet. Efter at have set på NDKs webside, regnede jeg med at lave en rod CMakeLists.txt og henvise de to andre (en til TagLib og en til JNI wrapper). Jeg ved meget lidt om C og CMakeLists. Dette er hvad jeg kom op 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 indeholder allerede en CMakeLists, så jeg netop pegede på det. Til JNI-indpakningen placerede jeg CMakeLists.txt inde i den mappe, hvor koden er:

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 forekommer mig, at jeg mangler noget rigtig indlysende her. Jeg tror, ​​at det skal gøre noget med den måde jeg etablerede CMake på, men jeg kan ikke finde ud af det.

No Answers Yet

Related questions

Hot questions

Language

Popular Tags