2015-06-26 3 views
0

У меня есть статическая библиотека 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; 
    } 
} 
+1

'System.loadLibrary (libtest)' не только добавляет '.so'on Android, но также добавляет' lib'. Поэтому он ищет 'liblibtest.so'. – Robert

+0

благодарит за информацию! Я знаю, что он ищет libtest.so, я хотел знать какой-то механизм, в котором ndk-build автоматически ищет файл libtest.a. – Dee

+0

Нет, он не ищет 'libtest.so', а для' liblibtest.so' (два раза lib в начале). Если вы хотите использовать libtest.so, измените имя своей библиотеки на «test». – Robert

ответ

2

Я не думаю, что вы можете загрузить статическую библиотеку из файла Java.

Hoewer замените include $(BUILD_STATIC_LIBRARY) на include $(BUILD_SHARED_LIBRARY) и удалите конец своего Android.mk. Таким образом, вы создадите общую библиотеку .so, которую вы сможете загрузить из java-файла.

+0

Я не использую android ndk, но crystalaX ndk, поэтому я хотел знать, поддерживает ли это загрузку статической библиотеки? – Dee

+0

Компиляция - это не то же самое, что загрузка библиотеки во время выполнения. Ваша ошибка связана с тем, что андроид может загружать только общую библиотеку '.so', и вы пытались загрузить статический lobrary' .a' – sonic

+0

Спасибо, я понял! Но есть ли какой-нибудь другой способ загрузки статической библиотеки, так что дайте мне знать, действительно ли это будет полезно? – Dee

Смежные вопросы