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