2015-02-28 3 views
0

Недавно я перешел из Eclipse в Android Studio и у меня возникли проблемы с доступом к собственным функциям. Первая нативная функция, которая называется nativeClassInit(). Большинство из того, что я видел по этому вопросу, связано с отсутствующим «статическим» идентификатором, но я включил его в MainActivity.java. Я пробовал уже пару дней, и у меня закончились идеи. Любые предложения приветствуются!UnsatisfiedLinkError в Android Studio с использованием Gradle

В System.loadLibrary функции не возвращают нуль, и я могу видеть * .so файлы в приложение, когда я бегу ADB Ls оболочки -l пакет/имя/путь/Lib:

-rwxr-xr-x system system  5096 2015-03-27 18:32 libPixa.so 
-rwxr-xr-x system system  775728 2015-03-27 18:32 libgnustl_shared.so 
-rwxr-xr-x system system 24998736 2015-03-26 15:01 libgstreamer_android.so 

Я очень новый Gradle так что не стесняйтесь критиковать мою build.gradle файл:

apply plugin: 'com.android.application' 

android { 
    compileSdkVersion 18 
    buildToolsVersion "21.1.2" 

    defaultConfig { 
     applicationId "com.sbimagingsystems.pixa" 
     minSdkVersion 14 
     targetSdkVersion 19 

     ndk { 
      moduleName "gstreamer_android" // Name of C++ module (i.e. libSeePlusPlus) 
      moduleName "Pixa" 
      cFlags "-std=c++11 -fexceptions" // Add provisions to allow C++11 functionality 
      stl "gnustl_shared" // Which STL library to use: gnustl or stlport 

     } 
    } 

    buildTypes { 
     release { 
      minifyEnabled false 
      proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt' 
     } 
    } 

    sourceSets { 
     main { 
      manifest.srcFile 'src/main/AndroidManifest.xml' 
      java.srcDir 'src' 
      res.srcDir 'res' 
      assets.srcDir 'assets' 

      jniLibs.srcDir 'src/main/libs' 
      jni.srcDirs = ['src/main/jni']  // location of native code files 
      //jniLibs.srcDirs = ['jniLibs'] 
     } 
    } 
} 

dependencies { 
    compile 'com.android.support:support-v4:19.0.0' 
    compile files('libs/acra-4.5.0.jar') 
    compile files('libs/dropbox-android-sdk-1.5.4.jar') 
    compile files('libs/httpmime-4.0.3.jar') 
    compile files('libs/json_simple-1.1.jar') 
    compile files('libs/pinchzoom.jar') 
    compile files('libs/universal-image-loader-1.8.7-snapshot-with-sources.jar') 
} 

local.properties:

gst.dir=/home/android-dev/AndroidDev/Installation/gstreamer 
sdk.dir=/home/android-dev/Android/Sdk 
ndk.dir=/home/android-dev/AndroidDev/Installation/android-ndk-r9c 

MainActivity.java

public class MainActivity extends FragmentActivity implements 
     SurfaceHolder.Callback, OnClickListener, OnItemClickListener 
{ 

    private native void nativeInit(); // Initialize native code, build pipeline, 
    // etc 

    private native void nativeFinalize(); // Destroy pipeline and shutdown 
    // native code 

    private native void nativePlay(); // Set pipeline to PLAYING 

    public native void nativePause(); // Set pipeline to PAUSED 

    private static native boolean nativeClassInit(); // Initialize native class: 
    // cache Method IDs for 
    // callbacks 

    // more code 

    static 
    { 
     System.loadLibrary("Pixa"); 
     System.loadLibrary("gstreamer_android"); 

     nativeClassInit(); 
    } 
} 

Pixa.c:

/* List of implemented native methods */ 
static JNINativeMethod native_methods[] = { 
    { "nativeInit", "()V", (void *) gst_native_init}, 
    { "nativeFinalize", "()V", (void *) gst_native_finalize}, 
    { "nativePlay", "()V", (void *) gst_native_play}, 
    { "nativePause", "()V", (void *) gst_native_pause}, 
    { "nativeSurfaceInit", "(Ljava/lang/Object;)V", (void *) gst_native_surface_init}, 
    { "nativeSurfaceFinalize", "()V", (void *) gst_native_surface_finalize}, 
    { "nativeClassInit", "()Z", (void *) gst_native_class_init}, 
    { "nativeStartRecord", "()V", (void *) gst_native_record_start}, 
    { "nativeStopRecord", "()V", (void *) gst_native_record_stop} 
}; 

/* Library initializer */ 
jint JNI_OnLoad(JavaVM *vm, void *reserved) { 
    JNIEnv *env = NULL; 

    java_vm = vm; 

    if ((*vm)->GetEnv(vm, (void**) &env, JNI_VERSION_1_4) != JNI_OK) { 
    __android_log_print (ANDROID_LOG_ERROR, "Receiver", "Could not retrieve JNIEnv"); 
    return 0; 
    } 
    jclass klass = (*env)->FindClass (env, "com/sbimagingsystems/pixa/MainActivity"); 
    (*env)->RegisterNatives (env, klass, native_methods, G_N_ELEMENTS(native_methods)); 

    pthread_key_create (&current_jni_env, detach_current_thread); 
    return JNI_VERSION_1_4; 
} 

и, наконец, LogCat:

02-27 18:06:41.799 8248-8248/com.sbimagingsystems.pixa E/AndroidRuntime﹕ FATAL EXCEPTION: main 
Process: com.sbimagingsystems.pixa, PID: 8248 
java.lang.UnsatisfiedLinkError: Native method not found: com.sbimagingsystems.pixa.MainActivity.nativeClassInit:()Z 
     at com.sbimagingsystems.pixa.MainActivity.nativeClassInit(Native Method) 
     at com.sbimagingsystems.pixa.MainActivity.<clinit>(MainActivity.java:3197) 
     at java.lang.Class.newInstanceImpl(Native Method) 
     at java.lang.Class.newInstance(Class.java:1208) 
     at android.app.Instrumentation.newActivity(Instrumentation.java:1067) 
     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2247) 
     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2389) 
     at android.app.ActivityThread.access$900(ActivityThread.java:169) 
     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1277) 
     at android.os.Handler.dispatchMessage(Handler.java:102) 
     at android.os.Looper.loop(Looper.java:136) 
     at android.app.ActivityThread.main(ActivityThread.java:5479) 
     at java.lang.reflect.Method.invokeNative(Native Method) 
     at java.lang.reflect.Method.invoke(Method.java:515) 
     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1283) 
     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1099) 
     at dalvik.system.NativeStart.main(Native Method) 

ответ

0

Использование

jni.srcDirs = [] //disable automatic ndk-build call 

отключить автоматический NDK строить на Android студии , вместо этого создайте с помощью ndk-build в командной строке. Это сгенерирует ваши .so-файлы и сможет правильно установить/

+0

Спасибо за ваш ответ. Я попробовал это, и при запуске ndk-build я получаю сообщение об ошибке: android/native_window.h: Нет такого файла или каталога. Не уверен, почему он не может найти заголовок – diimentio

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