Pembungkus JNI mengeluh tentang referensi yang tidak terdefinisi

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

Saya mencoba menggunakan pustaka TagLib di aplikasi Android. Sejauh yang saya tahu, saya harus menulis pembungkus JNI untuk itu. Saya ingin mencoba sesuatu yang sederhana - baca judul dari tag.

Saya menulis kode berikut di 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 kemudian memberi saya opsi untuk secara otomatis menghasilkan fungsi dalam kode asli (file tersebut disebut tagjni.c). Saya menambahkan beberapa kode saya sendiri untuk menambahkan fungsi:

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

Ada sesuatu yang terjadi dengan pernyataan penyertaan juga. Saya dapat menulis #include dan kemudian yang lain termasuk mengatakan bahwa itu tidak digunakan. Namun, ketika saya menghapusnya, tidak ada variabel yang dikenali lagi. Saat saya mengarahkan kursor ke kesalahan, saya mendapatkan opsi untuk menambahkan #include.

Ketika saya mencoba menjalankan aplikasi, saya mendapatkan kesalahan berikut (dan beberapa lainnya yang serupa): referensi tidak terdefinisi ke 'taglib_set_strings_unicode'

Apakah ini berarti bahwa fungsi yang saya panggil tidak dapat ditemukan? Saya memiliki banyak masalah pengaturan perpustakaan dan akhirnya berhasil entah bagaimana. Ketika saya mulai menulis pembungkus JNI, Android Studio mengeluhkan tentang file .c yang tidak disertakan dalam proyek. Setelah melihat halaman web NDK saya pikir saya harus membuat satu root CMakeLists.txt dan mereferensikan dua lainnya (satu untuk TagLib dan satu untuk pembungkus JNI). Saya tahu sangat sedikit tentang C dan CMakeLists. Inilah yang saya temukan:

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 sudah termasuk CMakeLists jadi saya hanya menunjuk ke sana. Untuk pembungkus JNI, saya menempatkan CMakeLists.txt di dalam direktori tempat kode tersebut:

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) 

Sepertinya saya kehilangan sesuatu yang sangat jelas di sini. Saya percaya itu harus melakukan sesuatu dengan cara saya mengatur CMake, tetapi saya tidak bisa mengetahuinya.

No Answers Yet

Related questions

Hot questions

Language

Popular Tags