【问题标题】:Android NDK app using android-ndk-r9 missing *.so files in final apk and Native method not found使用 android-ndk-r9 的 Android NDK 应用程序在最终 apk 中缺少 *.so 文件并且找不到本机方法
【发布时间】:2013-11-30 16:19:48
【问题描述】:

更新:我设法用最终的 apk 打包 *.so 文件,只需将其附加到 build.gradle

    tasks.withType(com.android.build.gradle.tasks.PackageApplication) {
        pkgTask -> pkgTask.jniDir new File(projectDir, 'src/main/libs')
    }

但是现在本地函数没有被调用。

native.c的代码

    #include <jni.h>
    #include <string.h>
    #include <android/log.h>

    JNIEXPORT jstring JNICALL Java_com_myndkapp_mybullet_MainActivity_helloLog(JNIEnv * env, jobject this) {
        __android_log_print(ANDROID_LOG_DEBUG, DEBUG_TAG, "NDK:LC: [%s]", "Check string you received in the Activity");
        return (*env)->NewStringUTF(env, "Hello from Native code :)");
    }

来自 MainActivity.java 的片段:

    .
    ..
    static {
            System.loadLibrary("myfndk");
        }
    private native String helloLog();
    .
    ..

ADB 日志的一些痕迹在这里:

    11-18 16:53:43.261    3469-3469/? D/PackageAddedReceiver﹕ package added com.myndkapp.mybullet
    11-18 16:53:43.856    2963-3214/? V/SmartFaceService - 3rd party pause﹕ onReceive [android.intent.action.ACTIVITY_STATE/com.myndkapp.mybullet/create]
    11-18 16:53:43.886    2823-2823/? D/dalvikvm﹕ Trying to load lib /data/app-lib/com.myndkapp.mybullet-1/libmyfndk.so 0x42a99270
    11-18 16:53:43.886    2823-2823/? D/dalvikvm﹕ Added shared lib /data/app-lib/com.myndkapp.mybullet-1/libmyfndk.so 0x42a99270
    11-18 16:53:43.886    2823-2823/? D/dalvikvm﹕ No JNI_OnLoad found in /data/app-lib/com.myndkapp.mybullet-1/libmyfndk.so 0x42a99270, skipping init
    11-18 16:53:50.596    2823-2823/? W/dalvikvm﹕ No implementation found for native Lcom/myndkapp/mybullet/MainActivity;.helloLog:()Ljava/lang/String;
    11-18 16:53:50.606    2823-2823/? E/AndroidRuntime﹕ FATAL EXCEPTION: main
java.lang.UnsatisfiedLinkError: Native method not found:         com.myndkapp.mybullet.MainActivity.helloLog:()Ljava/lang/String;
        at com.myndkapp.mybullet.MainActivity.helloLog(Native Method)
        at com.myndkapp.mybullet.MainActivity.access$000(MainActivity.java:15)
        at com.myndkapp.mybullet.MainActivity$1.onClick(MainActivity.java:35)
        at android.view.View.performClick(View.java:4475)
        at android.view.View$PerformClick.run(View.java:18786)
        at android.os.Handler.handleCallback(Handler.java:730)
        at android.os.Handler.dispatchMessage(Handler.java:92)
        at android.os.Looper.loop(Looper.java:137)
        at android.app.ActivityThread.main(ActivityThread.java:5419)
        at java.lang.reflect.Method.invokeNative(Native Method)
        at java.lang.reflect.Method.invoke(Method.java:525)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1187)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1003)
        at dalvik.system.NativeStart.main(Native Method)
    11-18 16:53:50.691    2963-3214/? V/SmartFaceService - 3rd party pause﹕ onReceive [android.intent.action.ACTIVITY_STATE/com.myndkapp.mybullet/pause]
    11-18 16:53:50.696    2963-3043/? D/CrashAnrDetector﹕ processName: com.myndkapp.mybullet
    11-18 16:53:50.696    2963-3043/? D/CrashAnrDetector﹕ broadcastEvent : com.myndkapp.mybullet data_app_crash
    11-18 16:54:05.781    2963-3449/? I/ActivityManager﹕ Process com.myndkapp.mybullet (pid 2823) (adj 9) has died.

我正在尝试在 Fedora 19 x86_64 上的 Android Studio 0.3.5 132.910074 中使用 android-ndk-r9 构建一个 android NDK 应用程序.

看起来 libmyfndk.so 没有添加到最终的 apk 文件中。我通过查看 apk 文件的内容确认了这一点。当我在 Galaxy S4 (Jelly Bean 4.3) 上运行这个测试应用程序时,它会抛出错误。

    11-17 19:03:28.816  26472-26472/com.myndkapp.mybullet E/AndroidRuntime﹕ 
    FATAL EXCEPTION: main
    java.lang.UnsatisfiedLinkError: Couldn't load myfndk from loader 
    dalvik.system.PathClassLoader[dexPath=/data/app/com.myndkapp.mybullet-1.apk,
    libraryPath=/data/app-lib/com.myndkapp.mybullet-1]: findLibrary returned null

我在这里寻找解决方案:

1.) https://groups.google.com/forum/#!msg/adt-dev/xj51eCWwhFw/pfhvCoquPysJ

2.) https://groups.google.com/forum/?fromgroups#!searchin/adt-dev/so/adt-dev/nQobKd2Gl_8/Z5yWAvCh4h4J

3.) Android studio, gradle and NDK

3.1) https://stackoverflow.com/a/16790675/1673000(这对我有用)

4.) https://github.com/OnlyInAmerica/Android-JNI-Gradle

5.) Include .so library in apk in android studio

这些似乎都不起作用。

这是我的 build-gradle 文件的内容

    buildscript {
        repositories {
            mavenCentral()
        }
        dependencies {
            classpath 'com.android.tools.build:gradle:0.6.3'
        }
    }
    apply plugin: 'android'

    repositories {
        mavenCentral()
    }

    android {
        compileSdkVersion 18
        buildToolsVersion '19.0.0'

        defaultConfig {
            minSdkVersion 10
            targetSdkVersion 19
        }
    }

    dependencies {
        compile 'com.android.support:appcompat-v7:+'
    }

任何提示,为什么没有调用 Native 函数?

【问题讨论】:

  • 您是否在运行时使用 System.load 加载了库?您的文件是否复制到 libs 内的正确 abi 子文件夹中?
  • 我像这样static {System.loadLibrary("myfndk");}libmyfndk.so 文件在MainActivity 中加载库src/main/libs/armeabi/
  • 这不是 ABI 问题,因为日志表明找到并加载了库。
  • 您的构建仍然会出现问题。 grep 是否在库文件中找到任何出现的 Java_ 函数名称?在中间对象?为了比较,请严格按照说明尝试构建 hello-jni。
  • 好吧,现在你只需要弄清楚区别在哪里——为什么你在一个库中获得了一个函数而在另一个库中没有。可以帮助的一件事是将 hello-jni 项目的副本转换为您需要的内容,一次一步,看看它在哪里中断。

标签: android android-ndk android-gradle-plugin


【解决方案1】:

它没有将 native.c 的代码放在 libmyfndk.so 中,这是因为我的 missing '=' Android.mk 在这一行:

LOCAL_SRC_FILES : native.c

将上面的行改为LOCAL_SRC_FILES := native.c,解决了这个问题。

【讨论】:

    猜你喜欢
    • 2014-10-01
    • 1970-01-01
    • 2012-05-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多