Android NDK - ошибка при связывании общей библиотеки и JNI Wrapper - PullRequest
0 голосов
/ 31 января 2019

Я пытаюсь связать общую библиотеку, сгенерированную мной, с помощью набора инструментов NDK-Standalone на другом компьютере сборки.Затем с помощью этого конкретного .so я поместил его на Android StudioОттуда я создал jni.h файл, используя javah, который затем помог мне написать .c JNI для вызовов функций.

Следовал этому примеру Как мне скомпилировать любую нативную (C, C ++) библиотеку, используя NDK в форме разделяемых библиотек .

ndk-build компилируется и, кажется,работает правильно, но при попытке запустить приложение на телефоне я получаю сообщение об ошибке

static { 
    System.loadLibrary("testLib")
}

, говорящее, что не удалось найти testLib.so, даже если оно сгенерировано и находится в каталоге libs/armeabi-v7a/testLib.so

ТЕКУЩАЯ ОШИБКА:

 01-31 14:41:53.779 19024-19024/com.jolopy.testing_02 E/AndroidRuntime: FATAL EXCEPTION: main
        Process: com.jolopy.testing_02, PID: 19024
        java.lang.UnsatisfiedLinkError: dalvik.system.PathClassLoader[DexPathList[[zip file "/data/app/com.jolopy.testing_02-2/base.apk"],nativeLibraryDirectories=[/data/app/com.jolopy.testing_02-2/lib/arm64, /vendor/lib64, /system/lib64]]] couldn't find "testLib.so"
            at java.lang.Runtime.loadLibrary(Runtime.java:367)
            at java.lang.System.loadLibrary(System.java:1076)
            at com.jolopy.testing_02.TestLib.<clinit>(TestLib.java:6)
            at com.jolopy.testing_02.MainActivity.onCreate(MainActivity.java:18)

Как я создал файл .so:

arm-linux-androideabi-gcc -c -fPIC testLib.c -o test.o

arm-linux-androideabi-gcc test.o -o testing.so

Оттуда я написал класс-оболочку JNI, используя javahкоторый сгенерировал файл testing_Android.h.Который оттуда сгенерировал JNI-оболочку test_Android.c, которую я использую для вызова функций из моей библиотеки testLib.c:

#include "testLib.h"
//Including Machine Generated Header
#include "testing_Android.h"
#include <stdio.h>

JNIEXPORT void JNICALL Java_com_jolopy_testing_102_TestLib_testinglib_1Initialize
  (JNIEnv *env, jobject obj){
    (void)env;
    (void)obj;

    testing_Initialize();
}


JNIEXPORT jint JNICALL Java_com_jolopy_testing_102_TestLib_testinglib_1Get_1Count
  (JNIEnv *env, jobject obj){
    (void)env;
    (void)obj;

    return(testing_Get_Count());
}


JNIEXPORT jint JNICALL Java_com_jolopy_testing_102_TestLib_testinglib_1Get_1CurrentName
  (JNIEnv *env, jobject obj, jlong ptr, jint x){
    (void)env;
    (void)obj;

    return (testing_Get_CurrentName((char *)ptr , (int)x));

}

Оттуда у меня есть 5 файлов в папке jni в Android, где явыполните команду ndk-build из:

 testing.so | testing_Android.h | testing_Android.c | Application.mk | Android.mk

Android.mk:

LOCAL_PATH :=$(call my-dir)
include $(CLEAR_VARS)

LOCAL_MODULE := testLib
LOCAL_SRC_FILES := testing.so
LOCAL_EXPORT_C_INCLUDES := testing_Android.c
include $(PREBUILT_SHARED_LIBRARY)

Application.mk:

APP_PLATFORM := android-19
APP_ABI := armeabi-v7a

Любые предложения или ошибки в моем прогрессечто вы могли бы видеть, что я не был бы очень признателен.

-Веселение!

Ответы [ 2 ]

0 голосов
/ 01 февраля 2019

Вместо использования автономной цепочки инструментов ndk, я использовал ndk-build на моей машине сборки, которая затем сгенерировала нужный мне файл libs.Оттуда я добавил файл libs с содержанием:

  1. arm64-v8a
  2. armeabi-v7a
  3. x86
  4. x86_64

В мой каталог Android в разделе src> main> jniLibs, который затем сохранил все файлы и просто добавил команду в мое приложение build.gradle:

sourceSets.main{
        jniLibs.srcDir 'src/main/jniLibs'
    }

Для правильной работы ndk-buildМне пришлось включить файл jniWrapper.c.

Android.mk:

LOCAL_PATH :=$(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := testing
LOCAL_SRC_FILES := jniWrapper.c \
                    testLib.c
include $(BUILD_SHARED_LIBRARY)

Application.mk (я тестировал со словом «все», но его не нужно):

APP_PLATFORM := android-23
APP_ABI := all

Я знаю, что это обходное решение, но по какой-то причине я не мог понять, как работает цепочка инструментов.

0 голосов
/ 01 февраля 2019

Измените ниже

APP_ABI := armeabi-v7a 

на

APP_ABI := arm64-v8a

Поскольку из ваших журналов ошибок ваше устройство arm64 ABI.


Если вы начинаете новый проект Android NDK, я хотел бы предложить вам начать с Android Studio + CMake цепочки инструментов, см. Здесь для моего личного проекта JniExample на базе AndroidСтудия и CMake:

...