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

时间:2014-07-21 18:55:50

标签: android android-ndk java-native-interface android-studio android-gradle

在我的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插件中的错误(我使用的是最新的!)还是我错过了什么?

2 个答案:

答案 0 :(得分:1)

符号位于: src / main / obj / local 所以添加到build.grade:

android.sources {
    main {
        jni {
            source {
                srcDir 'src/main/none'
            }
        }
        jniLibs {
            source {
                srcDir 'src/main/obj/local'
            }
        }
    }
}

然后转到Debug Configuration->调试器并添加到Symbol目录: 应用/建造/中间体/ jniLibs

之后,我能够调试我的本机代码。

答案 1 :(得分:0)

确保在方法中使用 JNIEXPORT JNICALL 宏。还要确保 proguard 不会先删除一个只调用jni东西的类 - 以及之后的jni代码本身,因为没有类正在使用它。

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

JNIEXPORT JNICALL

的示例
JNIEXPORT jint JNICALL foobar(JNIEnv* env, jclass cls) {
   return 0;
}