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
答案 0 :(得分:0)
我是否缺少使.so加载程序自动查找* d.so文件的设置?
后缀d
是您正在使用的库的约定,该约定与系统无关。您可能想要做的是使用相同的名称来构建调试版本,并根据您是在Studio中使用调试版本还是发行版本来进行区分(gradle将自动使用RelWithDebInfo
或Debug
CMake我认为有必要的发行类型)。
您还可以为每种构建样式使用不同的清单。
或者,放弃NativeActivity
并使用System.loadLibrary
自己处理。 NativeActivity
实际上仅对一小部分应用程序有用(由于它们都具有自己的UI,因此它们几乎都是独占游戏),因此,除非适用于您的应用程序,否则您将更容易使用{{1 }}。