Я пытаюсь связать общую библиотеку, сгенерированную мной, с помощью набора инструментов 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
Любые предложения или ошибки в моем прогрессечто вы могли бы видеть, что я не был бы очень признателен.
-Веселение!