Android 项目中如何直接引入准备好的 .so 文件

2023-04-26 20:02:25 +08:00
 nealot

native 常规开发流程大概是这样的:

在 Android Studio 中创建一个项目, 项目类型选择最下面的 "Native C++", 名称就叫 native

这时, 在 src/main/cpp 下会出现一个 native-lib.cpp 文件和对应的 CMakeLists.txt 文件, cpp 内容如下

#include <jni.h>
#include <string>

extern "C" JNIEXPORT jstring JNICALL
Java_com_example_native_MainActivity_stringFromJNI(
        JNIEnv* env,
        jobject /* this */) {
    std::string hello = "Hello from C++";
    return env->NewStringUTF(hello.c_str());
}

在 src/main/java/com/example/native/MainActivity.java 中 class MainActivity 中生成了一个对应的函数申明

    /**
     * A native method that is implemented by the 'native' native library,
     * which is packaged with this application.
     */
    public native String stringFromJNI();

Java 程序通过这个接口访问 native 代码

点击 Make Project 之后, 编译成功, 双击 build/outputs/apk/debug/app-debug.apk, 可以看到 apk 包含了 x86, x86_64, arm64_v8a, armeabi_v7a 四个平台的 libnative.so 文件


请问有没有办法把编译出来的 .so 提取出来, 然后直接导入到一个新的 Android 工程中。这个新的工程直接把 .so 文件打包到 apk 中,新工程代码中完全不包含 C 代码?

网上部分文章说,把 .so 文件放到 libs/arm64_v8a 等目录中就行, 打包 apk 时会自动包含, 但是实测下来没有效果, 似乎还有什么其它地方需要配置

1120 次点击
所在节点    程序员
4 条回复
whyrookie
2023-04-26 20:14:37 +08:00
gradle 少了路径配置?
sourceSets {
main {
jniLibs.srcDirs = ['libs']
}
}
winterbells
2023-04-26 21:00:56 +08:00
除了 1L 的方法还可以将 c 代码放在模块里,打包发布成 aar 文件
AoEiuV020CN
2023-04-27 00:05:30 +08:00
工程配置问题建议找个现成的项目或者 demo 参考着,
另外要说完全不包含 c 代码的话还可以导入个 jna ,直接用 java 调用任意 c/c++交互,
Neoqee
2023-04-27 09:37:37 +08:00
带上你原本 native 交互的 java 文件,然后创建 main/jniLibs 目录,在对应 abi 目录下放入对应的 so 文件就好了。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/935731

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX