Android中不使用jni c++可执行程序如何调用so库

在 Android 系统中,如果你不使用 JNI,而是直接通过一个 C++ 可执行程序来调用 .so 库,可以按照以下步骤进行操作:

步骤 1:创建 C++ 项目

创建一个 C++ 项目,并编写你的 C++ 代码。假设你有一个共享库 libyour-lib.so,你需要在你的 C++ 代码中调用其中的函数。

步骤 2:编写 C++ 代码

编写你的 C++ 代码,使用 dlopendlsymdlclose 函数来动态加载和调用 .so 库中的函数。

#include <iostream>
#include <dlfcn.h>

// 定义函数指针类型
typedef void (*your_function_type)();

int main() {
    // 打开共享库
    void* handle = dlopen("libyour-lib.so", RTLD_LAZY);
    if (!handle) {
        std::cerr << "Cannot open library: " << dlerror() << '\n';
        return 1;
    }

    // 清除之前的错误
    dlerror();

    // 获取函数指针
    your_function_type your_function = (your_function_type) dlsym(handle, "your_function");
    const char* dlsym_error = dlerror();
    if (dlsym_error) {
        std::cerr << "Cannot load symbol 'your_function': " << dlsym_error << '\n';
        dlclose(handle);
        return 1;
    }

    // 调用函数
    your_function();

    // 关闭共享库
    dlclose(handle);
    return 0;
}

步骤 3:编译 C++ 代码

使用 Android NDK 来编译你的 C++ 代码。创建一个 CMakeLists.txt 文件来配置编译过程。

cmake_minimum_required(VERSION 3.4.1)

# 添加你的 C++ 源文件
add_executable(your-executable main.cpp)

# 指定 .so 库的路径
set(distribution_DIR ${CMAKE_SOURCE_DIR}/libs)

# 链接 .so 库
target_link_libraries(your-executable
                      ${distribution_DIR}/${ANDROID_ABI}/libyour-lib.so
                      dl)

然后使用 CMake 和 NDK 编译你的项目:

mkdir build
cd build
cmake .. -DCMAKE_TOOLCHAIN_FILE=$ANDROID_NDK/build/cmake/android.toolchain.cmake -DANDROID_ABI=armeabi-v7a -DANDROID_PLATFORM=android-21
make

步骤 4:部署和运行

将生成的可执行文件和 .so 库拷贝到 Android 设备上。可以使用 adb 工具来完成这个步骤:

adb push your-executable /data/local/tmp/
adb push libyour-lib.so /data/local/tmp/

然后在设备上运行你的可执行文件:

adb shell
cd /data/local/tmp/
chmod +x your-executable
./your-executable

注意事项

  1. 权限:确保你有足够的权限在 Android 设备上执行可执行文件。通常需要将可执行文件放在 /data/local/tmp/ 目录,并赋予执行权限。
  2. 路径配置:在 Android 上运行时,确保 .so 文件的路径正确,可以使用绝对路径或确保工作目录正确。
  3. ABI 兼容性:确保编译时指定的 ABI 与目标设备的 ABI 兼容(如 armeabi-v7aarm64-v8a 等)。

通过上述步骤,你可以在 Android 系统中直接通过一个 C++ 可执行程序调用 .so 库,而无需使用 JNI。

  • 5
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值