JNI-kääre valittaa määrittelemättömiä viitteitä

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

Yritän käyttää TagLib-kirjastoa Android-sovelluksessa. Sikäli kuin tiedän, minun täytyy kirjoittaa JNI-kääre. Halusin kokeilla jotain yksinkertaista - lukea otsikko tagista.

Kirjoitin seuraavan koodin 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 antoi minulle mahdollisuuden luoda automaattisesti alkuperäisen koodin (tiedosto tunnetaan nimellä tagjni.c). Lisäsin joitain omia koodin lisäämään toimintoja:

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

Mukaan kuuluu myös jotain, johon sisältyy myös lausunto. Voin kirjoittaa #include ja sitten muut sisällyttää, että se on käyttämättä. Kuitenkin, kun poistan sen, mikään muuttujat ei enää tunnisteta. Kun viet yli virheitä, saan mahdollisuuden lisätä #include.

Kun yritän käyttää sovellusta, saan seuraavan virheen (ja joitakin vastaavia): undefined viittaus "taglib_set_strings_unicode"

Tarkoittaako tämä, että toimintoa, jota soitan, ei löydy? Minulla oli paljon kysymyksiä, jotka asettavat kirjastoa ylös ja lopulta saivat sen toimimaan jollain tavalla. Kun aloin kirjoittaa JNI-kääreen, Android Studio valitti, että .c-tiedosto ei sisälly hankkeeseen. Kun tarkastelemme NDK: n verkkosivua, tajusin, että minun täytyy luoda yksi root CMakeLists.txt ja viitata muut kaksi (yksi TagLib ja yksi JNI kääreelle). Tiedän hyvin vähän C: stä ja CMakeLististä. Tämän tulin esiin:

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 sisältää jo CMakeListit, joten osoitin sen juuri. JNI-kääreelle sijoitin CMakeLists.txt hakemiston sisälle, jossa koodi on:

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) 

Minusta tuntuu, että puuttuu jotain todella ilmeistä täällä. Uskon, että sen on tehtävä jotain tapaan, jolla luotiin CMake, mutta en pysty selvittämään sitä.

No Answers Yet

Related questions

Hot questions

Language

Popular Tags