Pembungkus JNI yang mengeluh tentang rujukan yang tidak ditentukan

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

Saya cuba menggunakan perpustakaan TagLib dalam apl Android. Setakat yang saya tahu, saya perlu menulis pembungkus JNI untuknya. Saya mahu mencuba sesuatu yang mudah - baca tajuk dari teg.

Saya menulis kod berikut di Jawa:

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 pilihan untuk menjana fungsi secara automatik dalam kod asal (fail dipanggil tagjni.c). Saya menambah beberapa kod saya sendiri untuk menambah 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);
} 

Terdapat sesuatu yang berlaku dengan kenyataan termasuk juga. Saya boleh menulis #include dan kemudian yang lain termasuk mengatakan bahawa ia tidak digunakan. Walau bagaimanapun, apabila saya memadamkannya, tiada pembolehubah lagi dikenali. Apabila saya mengarahkan ralat, saya mendapat pilihan untuk menambah #include.

Apabila saya cuba menjalankan aplikasinya, saya mendapat ralat berikut (dan beberapa yang lebih serupa): rujukan tidak jelas kepada 'taglib_set_strings_unicode'

Adakah ini bermakna bahawa fungsi yang saya panggil tidak dapat dijumpai? Saya mempunyai banyak masalah yang menetapkan perpustakaan dan akhirnya berjaya berfungsi entah bagaimana. Semasa saya mula menulis pembungkus JNI, Android Studio mengadu tentang fail .c yang tidak dimasukkan ke dalam projek. Selepas melihat laman web NDK saya fikir saya perlu membuat satu akar CMakeLists.txt dan merujuk dua yang lain (satu untuk TagLib dan satu untuk pembungkus JNI). Saya tahu sangat sedikit tentang C dan CMakeLists. Inilah yang saya datang dengan:

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 menunjuknya. Untuk pembungkus JNI, saya meletakkan CMakeLists.txt di dalam direktori di mana kod tersebut adalah:

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) 

Nampaknya saya kehilangan sesuatu yang sangat jelas di sini. Saya percaya ia perlu melakukan sesuatu dengan cara saya menubuhkan CMake, tetapi saya tidak dapat memikirkannya.

No Answers Yet

Related questions

Hot questions

Language

Popular Tags