Tanımsız referanslar hakkında şikayet JNI sarmalayıcı

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

Bir Android uygulamasında TagLib kitaplığını kullanmaya çalışıyorum. Bildiğim kadarıyla, bunun için bir JNI sarmalayıcı yazmam gerekiyor. Basit bir şey denemek istedim - etiketi başlıktan oku.

Java'da şu kodu yazdım:

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, daha sonra, yerel kodda işlevi otomatik olarak oluşturma seçeneği verdi (dosyaya tagjni.c denir). İşlevler eklemek için kendi kodumun bazılarını ekledim:

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

Ayrıca include deyimi ile devam eden bir şey var. Ben #include yazabilirim ve sonra da kullanılmayan olduğunu söyler. Ancak, onu sildiğimde, hiçbir değişken tanınmıyor. Hataların üzerine geldiğimde #include ekleme seçeneğine sahibim.

Uygulamayı çalıştırmaya çalıştığımda, aşağıdaki hatayı alıyorum (ve bazı daha benzerleri): 'taglib_set_strings_unicode' için tanımlanmamış başvuru

Bu, aradığım işlevin bulunamadığı anlamına mı geliyor? Kütüphaneyi kurarken bir sürü sorun yaşadım ve sonunda bir şekilde işe koyuldum. JNI sarmalayıcıyı yazmaya başladığımda, Android Studio .c dosyasının projeye dahil edilmediğinden şikayetçi oldu. NDK web sayfasına baktıktan sonra bir root CMakeLists.txt dosyası oluşturmam gerektiğini ve diğer ikisine (TagLib için bir tane ve JNI sarıcı için bir tane) başvurmam gerektiğini düşündüm. C ve CMakeLists hakkında çok az şey biliyorum. Bu benim ortaya çıktığım şey:

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 zaten bir CMakeLists içerdiğinden, sadece işaret ettim. JNI sarmalayıcı için, kodun bulunduğu dizinin içine CMakeLists.txt yerleştirdim:

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) 

Görünüşe göre burada gerçekten belirgin bir şey eksik. CMake kurarken bir şey yapması gerektiğine inanıyorum, ama bunu anlayamıyorum.

No Answers Yet

Related questions

Hot questions

Language

Popular Tags