JNI wrapper na nagrereklamo tungkol sa hindi natukoy na mga sanggunian

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

Sinusubukan kong gamitin ang TagLib library sa isang Android app. Bilang alam ko, kailangan kong magsulat ng JNI wrapper para dito. Nais kong subukan ang isang bagay na simple - basahin ang pamagat mula sa tag.

Isinulat ko ang sumusunod na code sa 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);
} 

Pagkatapos ay binigyan ako ng Android Studio ng pagpipilian upang awtomatikong buuin ang pag-andar sa katutubong code (ang file ay tinatawag na tagjni.c). Nagdagdag ako ng ilan sa aking sariling code upang magdagdag ng pag-andar:

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

Mayroong isang bagay na nagaganap sa isama rin ang pahayag. Maaari ko bang isulat ang #include at pagkatapos ay ang kabilang isama ay nagsasabi na hindi ito ginagamit. Gayunpaman, kapag tinanggal ko ito, wala sa mga variable ang nakilala ngayon. Kapag nag-hover ako sa mga error, nakukuha ko ang pagpipilian upang idagdag ang #include.

Kapag sinubukan kong patakbuhin ang app, nakukuha ko ang sumusunod na error (at ilan pang mga katulad nito): hindi natukoy na reference sa 'taglib_set_strings_unicode'

Nangangahulugan ba ito na hindi nahanap ang function na tinatawagan ko? Mayroon akong maraming mga isyu sa pagtatakda ng library up at sa wakas ay nakuha ito upang gumana sa anumang paraan. Nang magsimula ako sa pagsulat ng wrapper ng JNI, nagreklamo ang Android Studio tungkol sa .c file na hindi kasama sa proyekto. Matapos pagtingin sa pahina ng web ng NDK, may kinalabasan akong gumawa ng isang ugat na CMakeLists.txt at isangguni ang iba pang dalawa (isa para sa TagLib at isa para sa JNI wrapper). Alam kong napakaliit ang tungkol sa C at CMakeLists. Ito ay kung ano ako ay dumating sa:

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 ) 

Kasama na ng TagLib ang isang CMakeLists kaya itinuturo ko lang ito. Para sa wrapper ng JNI, inilagay ko ang CMakeLists.txt sa loob ng direktoryo kung saan ang code ay:

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) 

Mukhang sa akin na nawawalan ako ng isang bagay na talagang halata dito. Naniniwala ako na kailangan itong gawin sa paraan ng pag-set up ko ng CMake, ngunit hindi ko ito maintindihan.

No Answers Yet

Related questions

Hot questions

Language

Popular Tags