У меня есть статическая библиотека libtest.a (src \ main \ obj \ local \ armeabi), и я хочу проверить, работает ли ее рабочий или не. Итак, теперь, как загрузить статическую библиотеку (libtest.a) в MainActivity.java в (андроид-студия (1.1.0), gradle-2.2.1, ndk-crystallaXndk от https://www.crystax.net/en/download), поэтому ее функциональность возврата строки печатается в VirtualDevice (АВД)? Поскольку я использовал System.Loadlibrary (test), который автоматически добавляет суффикс. Так что теперь я получаю сообщение об ошибке libtest.so не найден. Есть только файл libtest.a, как обращаться в файле .java?Как загрузить статическую библиотеку (libtest.a) в MainActivity.java в студии android
--------- beginning of crash
06-26 13:17:12.284 1948-1948/com.example.myapplication E/AndroidRuntime﹕ FATAL EXCEPTION: main
Process: com.example.myapplication, PID: 1948
java.lang.UnsatisfiedLinkError: dalvik.system.PathClassLoader[DexPathList[[zip file "/data/app/com.example.myapplication-2/base.apk"],nativeLibraryDirectories=[/vendor/lib, /system/lib]]] couldn't find "liblibtest.so"
at java.lang.Runtime.loadLibrary(Runtime.java:366)
at java.lang.System.loadLibrary(System.java:989)
at com.example.myapplication.MainActivity.<clinit>(MainActivity.java:13)
at java.lang.reflect.Constructor.newInstance(Native Method)
at java.lang.Class.newInstance(Class.java:1572)
at android.app.Instrumentation.newActivity(Instrumentation.java:1065)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2199)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2360)
at android.app.ActivityThread.access$800(ActivityThread.java:144)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1278)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:135)
at android.app.ActivityThread.main(ActivityThread.java:5221)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:899)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:694)}
Android.mk
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := test
LOCAL_SRC_FILES := test.cpp
LOCAL_MODULE_FILENAME := libtest
include $(BUILD_STATIC_LIBRARY) //to build this libtest.a and use the same
include $(CLEAR_VARS)
LOCAL_MODULE := super
LOCAL_SRC_FILES := libtest.a
include $(PREBUILT_STATIC_LIBRARY
Application.mk
APP_CFLAGS += -fexceptions
APP_STL := gnustl_static
APP_STL := stlport_static
test.cpp
//#include "test.h"
#include <string.h>
#include <jni.h>
/*char* getString12();
char* Java_com_danfoss_myapplication_Application_getString12()
{ char x[80]="Hello World!!!";
char *s1 = new char [sizeof(x)];
strcpy(s1,x);
return s1;
}*/
extern "C" {
JNIEXPORT jstring JNICALL Java_com_danfoss_myapplication_MainActivity_getString12(JNIEnv *env,
jobject obj)
// { char sk[30]="hello-world!!!";
// const char *v = (const char *)sk;
jstring x="hellllooooo!!!!";
// return (*v)->NewStringUTF(env,"Hello from C++ JNI !");
return x;
}
}
'System.loadLibrary (libtest)' не только добавляет '.so'on Android, но также добавляет' lib'. Поэтому он ищет 'liblibtest.so'. – Robert
благодарит за информацию! Я знаю, что он ищет libtest.so, я хотел знать какой-то механизм, в котором ndk-build автоматически ищет файл libtest.a. – Dee
Нет, он не ищет 'libtest.so', а для' liblibtest.so' (два раза lib в начале). Если вы хотите использовать libtest.so, измените имя своей библиотеки на «test». – Robert