未定義の参照について不平を言う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ラッパーの作成を開始したとき、Androidスタジオは.cファイルがプロジェクトに含まれていないことに不満を持ちました。 私はNDKのWebページを見て、CMakeLists.txtを1つ作成し、他の2つ(TagLibとJNIラッパー用)を作成する必要があると考えました。 私は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ラッパーについては、コードがあるディレクトリの中に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