Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/186.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 本地活动和;无法加载本机库“;_Android_Android Ndk_Makefile - Fatal编程技术网

Android 本地活动和;无法加载本机库“;

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

我正试图基于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”文件如下所示:

<?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");
}