Android 本地活动和;无法加载本机库“;
我正试图基于Android NDK文件夹中的“本机活动”示例项目构建一个Android-10 NDK本机活动。但是,当我打开Eclipse并为我的项目选择“运行方式->Android应用程序”时,我的本机活动崩溃,出现以下运行时异常: 02-09 03:02:12.599:E/AndroidRuntime(881):java.lang.RuntimeException:无法启动活动组件信息{com.example.native_activity/android.app.NativeActivity}:java.lang.IllegalArgumentException:无法加载本机库:/data/app lib/com.example.native_activity-1/[library name]。所以 但是,我已经确认文件“lib[library name].so”已经存在于“libs/armeabi”(etc)路径中。我的本机活动最终需要加载三个“.so”文件,但无论我尝试加载一个“.so”文件还是所有三个“.so”文件,此错误都会持续。我的“AndroidManifest.xml”文件如下所示:Android 本地活动和;无法加载本机库“;,android,android-ndk,makefile,Android,Android Ndk,Makefile,我正试图基于Android NDK文件夹中的“本机活动”示例项目构建一个Android-10 NDK本机活动。但是,当我打开Eclipse并为我的项目选择“运行方式->Android应用程序”时,我的本机活动崩溃,出现以下运行时异常: 02-09 03:02:12.599:E/AndroidRuntime(881):java.lang.RuntimeException:无法启动活动组件信息{com.example.native_activity/android.app.NativeActivit
<?xml version="1.0" encoding="utf-8"?>
<!-- BEGIN_INCLUDE(manifest) -->
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.native_activity"
android:versionCode="1"
android:versionName="1.0">
<!-- This is the platform API where NativeActivity was introduced. -->
<uses-sdk android:minSdkVersion="9" />
<!-- This .apk has no Java code itself, so set hasCode to false. -->
<application android:label="@string/app_name" android:hasCode="false">
<!-- Our activity is the built-in NativeActivity framework class.
This will take care of integrating with our NDK code. -->
<activity android:name="android.app.NativeActivity"
android:label="@string/app_name"
android:configChanges="orientation|keyboardHidden">
<!-- Tell NativeActivity the name of or .so -->
<meta-data android:name="android.app.lib_name"
android:value="[library name]" />
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
<!-- END_INCLUDE(manifest) -->
需要做什么来修复此运行时异常?在JNI文件夹中,“”设置为什么?“[库名称]”名称应设置为正在生成的包的名称 问题似乎是系统正在寻找一个名称后面附加了-1的库 (来自错误消息)/data/app lib/com.example.native_activity-1
我看到andoird在以前存在一个库时会这样做,然后在名称中添加-1、-2等。不知道为什么,但可以肯定的是,这是一个版本控制问题,您可以通过卸载或重新安装来解决。查找有关加载失败的更多信息的有用方法是制作一个基本的Android应用程序,并使用
System.loadLibrary
在onCreate
方法中加载本机库,完全绕过本土活动
e、 g
然后,与NativeActivity提供的不太有用的“无法加载本机库”消息不同,您将得到一条更有用的消息,如
java.lang.UnsatisfiedLinkError:dlopen失败:无法加载“libdependens foo and bar.so”所需的库“lib42.so”;找不到库“lib42.so”导致的错误
这是由于缺少依赖项(甚至是实现)造成的。您可能会得到“无法加载库:libFoo.so”,但真正缺少的依赖项可能是libBar.so,这由libFoo.so决定。或者您可能只是声明了函数并调用了它们,但没有实现它们 问题在于构建so文件的工作方式。当您使用gcc构建共享对象时,链接步骤不会真正发生。例如,在libFoo.so中,您可以声明一个myFunc()原型并调用它。您可以跳过myFunc(){}的实现。gcc将很乐意为您构建一个.so文件。它将很高兴地在apk中结束。但是,当需要加载库时,会出现“无法加载库”消息 有两种方法可以解决这个问题:你要么按照AndrewJC在回答中告诉你的去做。或者开始注释代码,直到能够再次加载。从而定位缺少的函数实现
重要提示:添加到so文件中的-1-2后缀不是问题所在。这个评论误导了我,让我花了几天时间才发现这些数字后缀实际上是android软件包管理器的预期行为。你能详细描述一下吗?在我的jni文件夹中,我有android.mk,application.mk,jni_part.cpp我应该更改什么?在android.mk中,LOCAL_MODULE被设置为库名。我现在有-1,-2问题。我到底应该卸载什么?是的,-1,-2有问题吗?我也注意到了,你的回答让我半途而废。create中的loadLibrary()只给了我“findLibrary returned null”,但是如果我使用System.load(“/data/data/…”),那么我会得到实际缺少的dep!谢谢
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
System.loadLibrary("foo");
System.loadLibrary("bar");
System.loadLibrary("depends-on-foo-and-bar");
}