JNI wrapper klager over udefinerte referanser

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

Jeg prøver å bruke TagLib-biblioteket i en Android-app. Så langt jeg vet, må jeg skrive en JNI wrapper for den. Jeg ønsket å prøve noe enkelt - les tittelen fra taggen.

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 ga meg da muligheten til å automatisk generere funksjonen i innfødt kode (filen heter tagjni.c). Jeg la til litt av min egen kode for å legge til funksjonalitet:

#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 er noe som skjer med inkluderingserklæringen også. Jeg kan skrive #include og deretter den andre inkluderer at den er ubrukt. Men når jeg sletter det, blir ingen av variablene gjenkjent lenger. Når jeg svinger over feilene, får jeg muligheten til å legge til #include.

Når jeg prøver å kjøre appen, får jeg følgende feil (og noen flere lignende): Udefinert referanse til 'taglib_set_strings_unicode'

Betyr dette at funksjonen jeg ringer ikke kan bli funnet? Jeg hadde mange problemer med å sette opp biblioteket og endelig fikk det til å fungere på en eller annen måte. Da jeg begynte å skrive JNI-wrapper, klaget Android Studio om .c-filen ikke inkludert i prosjektet. Etter å ha sett på NDKs nettside fant jeg ut at jeg må lage en rot CMakeLists.txt og referere de to andre (en for TagLib og en for JNI wrapper). Jeg vet veldig lite om C og CMakeLists. Dette er hva jeg kom opp 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 inneholder allerede en CMakeLists, så jeg bare pekte på det. For JNI wrapper, plasserte jeg CMakeLists.txt inne i katalogen 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 virker for meg at jeg mangler noe helt klart her. Jeg tror det må gjøre noe med måten jeg setter opp CMake på, men jeg kan ikke finne ut det.

No Answers Yet

Related questions

Hot questions

Language

Popular Tags