
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 时会自动包含, 但是实测下来没有效果, 似乎还有什么其它地方需要配置
1 whyrookie 2023 年 4 月 26 日 gradle 少了路径配置? sourceSets { main { jniLibs.srcDirs = ['libs'] } } |
2 300 2023 年 4 月 26 日 除了 1L 的方法还可以将 c 代码放在模块里,打包发布成 aar 文件 |
3 AoEiuV020CN 2023 年 4 月 27 日 via Android 工程配置问题建议找个现成的项目或者 demo 参考着, 另外要说完全不包含 c 代码的话还可以导入个 jna ,直接用 java 调用任意 c/c++交互, |
4 Neoqee 2023 年 4 月 27 日 带上你原本 native 交互的 java 文件,然后创建 main/jniLibs 目录,在对应 abi 目录下放入对应的 so 文件就好了。 |