जेएनआई रैपर अपरिभाषित संदर्भों के बारे में शिकायत करते हैं

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

मैं एक एंड्रॉइड ऐप में टैगलिब लाइब्रेरी का उपयोग करने की कोशिश कर रहा हूं। जहां तक ​​मुझे पता है, मुझे इसके लिए एक जेएनआई रैपर लिखना है। मैं कुछ सरल कोशिश करना चाहता था - टैग से शीर्षक पढ़ें।

मैंने जावा में निम्न कोड लिखा है:

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

एंड्रॉइड स्टूडियो ने मुझे मूल कोड में स्वचालित रूप से फ़ंक्शन उत्पन्न करने का विकल्प दिया (फ़ाइल को 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 कर सकता हूं और फिर दूसरे में शामिल है कि यह अप्रयुक्त है। हालांकि, जब मैं इसे हटा देता हूं, तो अब भी कोई भी चर नहीं पहचाना जाता है। जब मैं त्रुटियों पर होवर करता हूं, तो मुझे # शामिल करने का विकल्प मिलता है।

जब मैं ऐप चलाने की कोशिश करता हूं, तो मुझे निम्न त्रुटि मिलती है (और कुछ और समान): 'taglib_set_strings_unicode' के लिए अनिर्धारित संदर्भ

क्या इसका मतलब यह है कि मैं जिस फ़ंक्शन को कॉल कर रहा हूं वह नहीं मिल सकता है? मुझे लाइब्रेरी को स्थापित करने में बहुत सारे मुद्दे थे और आखिरकार इसे किसी भी तरह काम करने के लिए मिला। जैसे ही मैंने जेएनआई रैपर लिखना शुरू किया, एंड्रॉइड स्टूडियो ने परियोजना में शामिल नहीं होने वाली .c फ़ाइल के बारे में शिकायत की। एनडीके वेब पेज को देखने के बाद मुझे लगा कि मुझे एक रूट CMakeLists.txt बनाना है और दूसरे दो (टैगलिब के लिए एक और जेएनआई रैपर के लिए) को संदर्भित करना है। मैं सी और सीएमकेलिस्ट के बारे में बहुत कम जानता हूं। मैंने ये ढूंढ निकाला:

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 ) 

टैगलिब में पहले से ही एक सीएमकेलिस्ट शामिल हैं, इसलिए मैंने बस इसकी ओर इशारा किया। जेएनआई रैपर के लिए, मैंने निर्देशिका के अंदर 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) 

ऐसा लगता है कि मुझे यहां कुछ वास्तव में स्पष्ट याद आ रही है। मेरा मानना ​​है कि इसे सीमेक स्थापित करने के तरीके से कुछ करना है, लेकिन मैं इसे समझ नहीं सकता।

No Answers Yet

Related questions

Hot questions

Language

Popular Tags