Trình bao bọc JNI phàn nàn về các tham chiếu chưa được xác định

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

Tôi đang cố gắng sử dụng thư viện TagLib trong một ứng dụng Android. Theo như tôi biết, tôi phải viết một JNI wrapper cho nó. Tôi muốn thử một cái gì đó đơn giản - đọc tiêu đề từ thẻ.

Tôi đã viết đoạn mã sau trong 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 sau đó đã cho tôi tùy chọn tự động tạo hàm trong mã gốc (tệp được gọi là tagjni.c). Tôi đã thêm một số mã của riêng tôi để thêm chức năng:

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

Có điều gì đó đang xảy ra với câu lệnh include. Tôi có thể viết #include và sau đó bao gồm khác nói rằng nó không được sử dụng. Tuy nhiên, khi tôi xóa nó, không có biến nào được nhận ra nữa. Khi tôi di chuột qua các lỗi, tôi nhận được tùy chọn thêm #include.

Khi tôi cố gắng chạy ứng dụng, tôi nhận được lỗi sau (và một số lỗi tương tự): tham chiếu không xác định đến 'taglib_set_strings_unicode'

Điều này có nghĩa là chức năng tôi đang gọi không thể được tìm thấy? Tôi đã có rất nhiều vấn đề trong việc thiết lập thư viện và cuối cùng đã làm cho nó hoạt động bằng cách nào đó. Khi tôi bắt đầu viết trình bao bọc JNI, Android Studio đã phàn nàn về tệp .c không được đưa vào dự án. Sau khi nhìn vào trang web NDK, tôi đã tìm ra rằng tôi phải tạo một CMakeLists.txt gốc và tham chiếu hai tệp kia (một cho TagLib và một cho trình bao bọc JNI). Tôi biết rất ít về C và CMakeLists. Đây là những gì tôi nghĩ ra:

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 đã bao gồm một CMakeLists vì vậy tôi chỉ chỉ vào nó. Đối với trình bao bọc JNI, tôi đã đặt CMakeLists.txt bên trong thư mục chứa mã:

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) 

Dường như với tôi rằng tôi đang thiếu một cái gì đó thực sự rõ ràng ở đây. Tôi tin rằng nó phải làm một cái gì đó với cách tôi thiết lập CMake, nhưng tôi không thể tìm ra nó.

No Answers Yet

Related questions

Hot questions

Language

Popular Tags