0

我正在使用以下引导代码来加载我的本机活动(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);
    }
}

我收到以下错误消息:

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

这根本没有告诉我出了什么问题。有没有办法获得更多的调试输出?“无效参数”是什么意思?

4

2 回答 2

0

我修好了它:

dlerror()

给出了更好的错误信息。

如果有人感兴趣,这是引导代码:

#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);
    }
}
于 2013-06-06T19:14:26.433 回答
-1

你可以这样做..
把那个库放在原始目录中并加载它
对于原始文件,你应该考虑在 res 目录中创建一个原始文件夹,然后调用

 getResources().openRawResource(resourceName) 

从你的活动。
然后你可以按照你喜欢的方式使用它。

于 2013-06-06T12:22:55.943 回答