"执行dlopen:无效的参数"加载本地活动时 [英] "dlopen: Invalid argument" when loading native activity

查看:456
本文介绍了"执行dlopen:无效的参数"加载本地活动时的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我用下面的引导code加载我的家乡活动(jngl测试):

I'm using the following bootstrapping code to load my native activity (jngl-test):

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

const std::string LIB_PATH = "/data/data/com.bixense.jngl_test/lib/";

void* load_lib(const std::string& l) {
    void* handle = dlopen(l.c_str(), RTLD_NOW | RTLD_GLOBAL);
    if (!handle) {
        throw std::runtime_error(std::string("dlopen(") + l + "): " + strerror(errno));
    }
    return handle;
}

void ANativeActivity_onCreate(ANativeActivity* app, void* ud, size_t udsize) {
    try {
        load_lib(LIB_PATH + "libogg.so");
        load_lib(LIB_PATH + "libvorbis.so");
        auto main = reinterpret_cast<void (*)(ANativeActivity*, void*, size_t)>(
            dlsym(load_lib(LIB_PATH + "libjngl-test.so"), "ANativeActivity_onCreate")
        );
        if (!main) {
            throw std::runtime_error("undefined symbol ANativeActivity_onCreate");
        }
        main(app, ud, udsize);
    } catch(std::exception& e) {
        __android_log_print(ANDROID_LOG_ERROR, "bootstrap", e.what());
        ANativeActivity_finish(app);
    }
}

我收到以下错误信息:

I get the following error message:

dlopen(/data/data/com.bixense.jngl_test/lib/libjngl-test.so): Invalid argument

这并没有告诉我都怎么回事错了。有没有办法让更多的调试输出?还有什么比无效参数是什么意思?

This doesn't tell me at all whats going wrong. Is there a way to get more debug output? What could "Invalid argument" mean?

推荐答案

我固定它:

dlerror()

给出了一个更好的错误消息。

gives a far better error message.

下面是引导code,如果有人有兴趣:

Here's the bootstrap code if someone is interested:

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

void* load_lib(const std::string& l) {
    auto handle = dlopen(std::string("/data/data/com.bixense.jngl_test/lib/" + l).c_str(),
                         RTLD_NOW | RTLD_GLOBAL);
    if (!handle) {
        throw std::runtime_error(std::string("dlopen(") + l + "): " + dlerror());
    }
    return handle;
}

void ANativeActivity_onCreate(ANativeActivity* app, void* ud, size_t udsize) {
    try {
        load_lib("libogg.so");
        load_lib("libvorbis.so");
        auto main = reinterpret_cast<void (*)(ANativeActivity*, void*, size_t)>(
            dlsym(load_lib("libjngl-test.so"), "ANativeActivity_onCreate")
        );
        if (!main) {
            throw std::runtime_error("undefined symbol ANativeActivity_onCreate");
        }
        main(app, ud, udsize);
    } catch(std::exception& e) {
        __android_log_print(ANDROID_LOG_ERROR, "bootstrap", e.what());
        ANativeActivity_finish(app);
    }
}

这篇关于&QUOT;执行dlopen:无效的参数&QUOT;加载本地活动时的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆