정의되지 않은 참조에 대해 불평하는 JNI 래퍼

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

Android 앱에서 TagLib 라이브러리를 사용하려고합니다. 내가 아는 한, JNI 래퍼를 작성해야한다. 나는 간단한 것을 시도하고 싶었다 - 태그에서 제목을 읽는다.

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에서 자동으로 네이티브 코드로 함수를 생성하는 옵션을 제공했습니다 (이 파일의 이름은 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 문도 계속 진행됩니다. 나는 #include 를 쓸 수 있고, 나머지는 그것을 사용하지 않는다고 말한다. 그러나 삭제할 때 더 이상 변수가 인식되지 않습니다. 오류 위로 마우스를 가져 가면 #include 옵션을 추가 할 수 있습니다.

내가 응용 프로그램을 실행하려고하면 다음과 같은 오류가 발생합니다 (그리고 더 비슷한 것들) : 'taglib_set_strings_unicode'에 대한 정의되지 않은 참조

이것은 내가 부르고있는 기능을 찾을 수 없다는 것을 의미합니까? 라이브러리를 설정하는 데 많은 문제가 있었으며 마침내 어떻게 든 작동하도록했습니다. JNI wrapper를 작성하기 시작하자 Android Studio는 프로젝트에 포함되지 않은 .c 파일에 대해 불평했다. NDK 웹 페이지를보고 난 후에 하나의 루트 CMakeLists.txt를 만들고 다른 두 개 (TagLib와 JNI wrapper를위한 것)를 참조해야한다고 생각했습니다. C와 CMakeLists에 대해서는 거의 알지 못합니다. 이것이 내가 생각해 낸 것입니다.

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에는 이미 CMakeLists가 포함되어 있으므로 방금 지적했습니다. JNI wrapper의 경우, 코드가있는 디렉토리에 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) 

여기에 내가 정말로 분명한 뭔가를 놓치고있는 것처럼 보입니다. 나는 그것이 내가 CMake를 설정하는 방식으로 뭔가를해야한다고 생각하지만, 나는 그것을 이해할 수 없다.

No Answers Yet

Related questions

Hot questions

Language

Popular Tags