使用Gradle构建本机代码时会删除符号

Eri*_*man 8 java-native-interface android android-ndk android-studio android-gradle-plugin

在我的Android项目中,使用最新的Gradle构建工具,我有一个包含本机C代码和一些简单功能的文件.C文件中包含的唯一内容是string.h和jni.h,函数只返回String和primitives.除了其他源文件夹(java,res等)之外,该文件还放在jni目录中.

当我构建应用程序时,它编译C代码,生成.so文件并将其包含在我的APK中.问题是.so文件删除了所有符号.

检查放在build/intermediate/ndk/obj中的中间.so文件时,所有符号仍然存在.因此,在生成第一个.so文件之后的某个地方,当它被打包时,一切都被剥离了.

使用命令行ndk-build构建.so文件时,一切正常并且包含符号.

这是Android Gradle插件中的错误(我使用的是最新的!)或者我错过了什么?

Mar*_*rdy 1

确保在您的方法中使用JNIEXPORTJNICALL宏。还要确保proguard不会首先剥离仅调用 jni 内容的类,然后再剥离 jni 代码本身,因为没有类在使用它。

https://developer.android.com/tools/help/proguard.html#configuring

JNIEXPORTJNICALL的示例

JNIEXPORT jint JNICALL foobar(JNIEnv* env, jclass cls) {
   return 0;
}
Run Code Online (Sandbox Code Playgroud)