Το περιτύλιγμα JNI διαμαρτύρεται για αόριστες αναφορές

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

Προσπαθώ να χρησιμοποιήσω τη βιβλιοθήκη TagLib σε μια εφαρμογή Android. Από όσο γνωρίζω, πρέπει να γράψω ένα περιτύλιγμα JNI γι 'αυτό. Ήθελα να δοκιμάσω κάτι απλό - διαβάστε τον τίτλο από την ετικέτα.

Έγραψα τον ακόλουθο κώδικα στην 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 μου έδωσε την επιλογή να δημιουργήσει αυτόματα τη λειτουργία στον εγγενή κώδικα (το αρχείο ονομάζεται tagjni.c). Πρόσθεσα μερικές από τις δικές μου κώδικες για να προσθέσω λειτουργικότητα:

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

Υπάρχει κάτι που συμβαίνει και με τη δήλωση συμμετοχής. Μπορώ να γράψω #include και στη συνέχεια το άλλο λέει ότι είναι αχρησιμοποίητο. Ωστόσο, όταν τη διαγράψω, καμία από τις μεταβλητές δεν αναγνωρίζεται πια. Όταν μετακινώ τα σφάλματα, έχω την επιλογή να προσθέσω το #include.

Όταν προσπαθώ να τρέξω την εφαρμογή, έχω το ακόλουθο σφάλμα (και μερικές παρόμοιες): undefined αναφορά στο 'taglib_set_strings_unicode'

Αυτό σημαίνει ότι η λειτουργία που καλώ δεν μπορεί να βρεθεί; Είχα πολλά ζητήματα που έθεσα τη βιβλιοθήκη και τελικά το κατάφερα να λειτουργήσει με κάποιο τρόπο. Καθώς άρχισα να γράφω το περιτύλιγμα JNI, το Android Studio παραπονέθηκε ότι το αρχείο .c δεν συμπεριλήφθηκε στο έργο. Αφού έψαχνα την ιστοσελίδα NDK σκέφτηκα ότι πρέπει να δημιουργήσω μια ρίζα CMakeLists.txt και να αναφερθώ στις άλλες δύο (μία για το TagLib και μία για το wrapper JNI). Ξέρω πολύ λίγα για το C και το CMakeLists. Αυτό είναι που ήρθα με:

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 περιλαμβάνει ήδη CMakeLists, γι 'αυτό το επεσήμανα. Για το περιτύλιγμα JNI, έβαλα το CMakeLists.txt μέσα στον κατάλογο όπου βρίσκεται ο κώδικας:

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) 

Μου φαίνεται ότι μου λείπει κάτι πραγματικά προφανές εδώ. Πιστεύω ότι πρέπει να κάνει κάτι με τον τρόπο που έχω δημιουργήσει CMake, αλλά δεν μπορώ να το καταλάβω.

No Answers Yet

Related questions

Hot questions

Language

Popular Tags