gpt4 book ai didi

android - 无法在 native Activity 应用程序中加载具有依赖项的 native 共享库

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:54:38 25 4
gpt4 key购买 nike

在我的 Android 应用程序中,我有 4 个库:

libTemplate.so
depends on libPorkholt.so
libPorkholt.so
depends on libpng15.so
depends on liblua.so
depends on libopenal.so
libpng15.so
liblua.so
libopenal.so

如果我编写一个链接到 libTemplate 的小型命令行可执行文件并手动调用 ANativeActivity_onCreate,它链接并运行得很好(如果我将 LD_LIBRARY_PATH 指向/data/data/com.mycompany.Template/lib)

如果我运行我的应用程序,我会收到这条非常有用的错误消息:

E/AndroidRuntime(13214): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.mycompany.Template/android.app.NativeActivity}: java.lang.IllegalArgumentException: Unable to load native library: /data/data/com.mycompany.Template/lib/libTemplate.so

它甚至没有进入 ANativeActivity_onCreate,所以我唯一的猜测是它与链接有关

我应该提一下,我在这个脚本中使用 CMake:http://code.google.com/p/android-cmake/自己构建库(没有 ndk-build)。我设法用它编译了 native Activity 示例,所以我知道它有效。

此外,我确保没有库在其 soname 中包含版本号

我的 list :

<?xml version="1.0" encoding="utf-8"?>
<!-- BEGIN_INCLUDE(manifest) -->
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.mycompany.Template"
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="Template Porkholt project" 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="Template Porkholt project"
android:configChanges="orientation|keyboardHidden">
<!-- Tell NativeActivity the name of or .so -->
<meta-data android:name="android.app.lib_name"
android:value="Template" />
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>

</manifest>
<!-- END_INCLUDE(manifest) -->

最佳答案

由于 Android 显然不够智能,无法正确设置 LD_LIBRARY_PATH,我设法通过创建一个手动加载实际 Activity 的小型 Bootstrap 库来解决我的问题。这是代码:

#include <android/native_activity.h>
#include <android/log.h>
#include <dlfcn.h>
#include <errno.h>
#include <stdlib.h>

#define LOGI(...) ((void)__android_log_print(ANDROID_LOG_INFO, "Porkholt", __VA_ARGS__))
#define LOGE(...) ((void)__android_log_print(ANDROID_LOG_ERROR, "Porkholt", __VA_ARGS__))

#define LIB_PATH "/data/data/@PH_BUNDLE_ID@/lib/"

void * load_lib(const char * l)
{
void * handle = dlopen(l, RTLD_NOW | RTLD_GLOBAL);
if (!handle)
{
LOGE("dlopen(\"%s\"): %s", l, strerror(errno));
exit(1);
}
return handle;
}

void ANativeActivity_onCreate(ANativeActivity * app, void * ud, size_t udsize)
{
LOGI("Loaded bootstrap");
load_lib(LIB_PATH "libpng15.so");
load_lib(LIB_PATH "liblua.so");
load_lib(LIB_PATH "libopenal.so");
load_lib(LIB_PATH "libPorkholt.so");
void (*main)(ANativeActivity*, void*, size_t) = dlsym(load_lib(LIB_PATH "lib@PH_APP_TARGET@.so"), "ANativeActivity_onCreate");
if (!main)
{
LOGE("undefined symbol ANativeActivity_onCreate");
exit(1);
}
main(app, ud, udsize);
}

关于android - 无法在 native Activity 应用程序中加载具有依赖项的 native 共享库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12524664/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com