找不到本机库

时间:2019-08-07 05:26:33

标签: android-ndk

Android无法在.so文件中找到我的应用代码。

我有一个纯的NDK项目(C ++项目,没有Java),该项目可构建.so文件(libdygd.so)。在发布模式下,该文件在启动过程中找到,但在调试模式下找不到。 CMake调试模式构建(从gradle启动)向文件(libdygdd.so)添加了后缀。 在AndroidManifest.xml中有一行: 如果我将android:value =“ dygd”更改为android:value =“ dygdd”,则调试版本会加载.so(应用启动正常),但发行版本无效(此更改未找到.so文件)

我是否缺少使.so加载程序自动查找* d.so文件的设置?

构建后的文件可以在这里找到: ./app/build/intermediates/cmake/debug/obj/armeabi-v7a/libdygdd.so

AndroidManifest.xml:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    package="com.example.dygd">

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme"
        tools:ignore="GoogleAppIndexingWarning">
        <activity
            android:name="android.app.NativeActivity"
            android:configChanges="keyboardHidden|orientation|screenSize"
            android:screenOrientation="landscape"
            android:label="@string/app_name">
            <meta-data android:name="android.app.lib_name" android:value="dygd" />

            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>
</manifest>

在设备上启动应用程序时,我得到以下日志输出:

E/AndroidRuntime(18572): Process: com.example.dygd, PID: 18572
E/AndroidRuntime(18572): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.dygd/android.app.NativeActivity}: java.lang.IllegalArgumentException: Unable to find native library dygd using classloader: dalvik.system.PathClassLoader[DexPathList[[zip file "/data/app/com.example.dygd-VWbId7f-ZG7VzirT0GBJBA==/base.apk"],nativeLibraryDirectories=[/data/app/com.example.dygd-VWbId7f-ZG7VzirT0GBJBA==/lib/arm, /data/app/com.example.dygd-VWbId7f-ZG7VzirT0GBJBA==/base.apk!/lib/armeabi-v7a, /system/lib, /system/vendor/lib]]]
E/AndroidRuntime(18572): Caused by: java.lang.IllegalArgumentException: Unable to find native library dygd using classloader: dalvik.system.PathClassLoader[DexPathList[[zip file "/data/app/com.example.dygd-VWbId7f-ZG7VzirT0GBJBA==/base.apk"],nativeLibraryDirectories=[/data/app/com.example.dygd-VWbId7f-ZG7VzirT0GBJBA==/lib/arm, /data/app/com.example.dygd-VWbId7f-ZG7VzirT0GBJBA==/base.apk!/lib/armeabi-v7a, /system/lib, /system/vendor/lib]]]
W/ActivityManager( 1400):   Force finishing activity com.example.dygd/android.app.NativeActivity

1 个答案:

答案 0 :(得分:0)

  

我是否缺少使.so加载程序自动查找* d.so文件的设置?

后缀d是您正在使用的库的约定,该约定与系统无关。您可能想要做的是使用相同的名称来构建调试版本,并根据您是在Studio中使用调试版本还是发行版本来进行区分(gradle将自动使用RelWithDebInfoDebug CMake我认为有必要的发行类型)。

您还可以为每种构建样式使用不同的清单。

或者,放弃NativeActivity并使用System.loadLibrary自己处理。 NativeActivity实际上仅对一小部分应用程序有用(由于它们都具有自己的UI,因此它们几乎都是独占游戏),因此,除非适用于您的应用程序,否则您将更容易使用{{1 }}。