使JNI

时间:2015-11-30 08:15:57

标签: android c++ c android-ndk

硬件手机和平板电脑的内存太少,但HAXM运行正常吗?

我的基本问题是我的应用程序(很可能是我的Java应用程序加载的JNI动态库)太大了。 Java应用程序在没有使用HW电话和模板调用JNI指令的情况下崩溃。但是它可以与HAXM仿真器一起使用,它只会扩大自身的主存储器。

我假设我需要减小JNI动态库的大小。

我有大量的C函数,大多数都没有使用过?

涵盖应用程序编程的主题领域,使用了超过64000个条目和995个。在Win32中创建一个C程序,链接器会过滤掉未使用过的东西。真正顺利。

然而,在Android Studio中,我像往常一样使用动态JNI库编写的Java应用程序,即Android JNI标准使用。没有链接器确定使用了哪些功能。但是我有一个前端JNI文件,可以调用另一组C函数。我假设Java系统不分析调用哪些JNI函数并找到能够对其进行排序的调用树? (WIn32中的DLL也不会这样做,因为它不知道将要调用什么,我猜。)

静态lib方法可能有效,我该怎么做?

一个想法是创建大量C函数的静态库,当标准的Android JNI通过前端JNI文件的调用使用它时,我假设这只会使用所需静态库的函数并删除其余的,就像链接Win32 C程序时一样。我可能错了?

好吧,我试图了解如何在Android Studio中执行静态库,以及如何使用专有的静态库链接到JNI动态库。然而,通过谷歌搜索或通过stackoverflow搜索很难找到。我认为这种方法很少见。

  • 有谁知道如何在Android Studio中制作静态JNI库
  • 有没有人知道如何在Android Studio中使用静态JNI lib制作带有的Android应用程序 JNI前端调用静态lib函数吗?
  • 能描述一下吗?
  • 在JNI中可能无法实现,然后知道它是好的 不可能。有可能以这种方式进行这种优化吗?

2 个答案:

答案 0 :(得分:0)

您可以在Android Studio中使用静态库,但是您应该使用 Android.mk 作为配置,使用 ndk-build 进行构建。

在你的build.gradle中,你可以参考这个预建的库" c:\ android \ obj \ libmystatic.a":

model {
    android.ndk {
        moduleName = "hello-jni"
        abiFilters += armeabi-v7a
        ldFlags += "-LC:/android/obj"
        ldLibs += "mystatic"
    }
}

答案 1 :(得分:0)

问题是如何在JNI文件中删除未使用的功能

我在@Michaels提示的帮助下回答了我自己的问题。

基本问题是硬件三星Tab3太大的APK,所以它崩溃,而HAXM工作正常。使用一个小的JNI假人我最初在Tab3中工作但不是真正的JNI代码。我的假设是它太大了,不是吗?

如果优化以其他方式可用,那么在制作动态自动JNI库时使用它创建静态库的想法是多余的。恐怖是手动整理超过64K条目中使用的内容。非常感谢@Alex。

是的,可以通过在app gradle中设置以下标志来实现优化:

android.ndk {
    moduleName = "XXXX"
    cppFlags.add("-ffunction-sections")
    cppFlags.add("-fdata-sections")
    cppFlags.add("-fvisibility=hidden")
    CFlags.add("-ffunction-sections")
    CFlags.add("-fdata-sections")
    CFlags.add("-fvisibility=hidden")
    ldFlags.add("-Wl,--gc-sections")
    /*
     * Other ndk flags configurable here are
     * cppFlags += "-fno-rtti"
     * cppFlags += "-fno-exceptions"
     * ldLibs    = ["android", "log"]
     * stl       = "system"
     */
}

这会将我的APK从11Mb减少到7Mb(删除JNI部分中未使用的功能)。应用程序中的一些更改,将Win64应用程序从0,9Mb减少到0.6Mb,将APK降低到6Mb。将Build变量设置为arm7 debug(Tab3),APK为2,7MB,但仍然崩溃(在主java中的load jni library命令中)。

我如何知道发布大小? - 可以测试吗?

问题是APK在发布模式下的大小(我假设它比调试模式小)但发布版本必须签名等我的意图不是为市场发布应用程序而是测试它的大小,看看计划的应用程序是否可以适用于商业Android硬件单元。如果不是,我必须对我计划的应用程序进行一般性的重新设计,但要更加明智。但重新设计是一项巨大的工作,我宁愿确定最初的计划是不可能的?看到像MS Office副本这样的应用程序我认为它必须是可能的。

试图摆弄Build / Edit风格时,Gradle只是抱怨放弃调试功能,所以这是一个死胡同。

所以现在的问题是:

是否有可能在没有商业发布的情况下找出并尝试发布形状的应用?