2014-07-21 35 views
8

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

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

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

使用命令行ndk-build生成.so文件时,一切正常,符号也包含在内。

它是Android Gradle插件中的错误(我正在使用最新!)还是我错过了什么?

+0

您使用哪个NDK版本? –

+0

试过r9d和r10。同样的结果。 –

回答

0

确保在您的方法中使用JNIEXPORTJNICALL宏。还要确保proguard不会首先剥离一个只调用jni的类 - 后来在jni代码本身,因为没有类正在使用它。

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

示例JNIEXPORT AND JNICALL

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

的符号是:的src /主/ OBJ /本地 所以添加到build.grade:

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

然后去调试配置 - >调试器,并加入到符号目录: 应用程序/编译/中间体/ jniLibs

后,我是能够调试我的本地代码。