制作一个供JNI读取的Android Studio JNI静态库

Making an Android Studio JNI static lib to be read by JNI

本文关键字:JNI 读取 Android Studio 静态 一个      更新时间:2023-10-16

硬件手机和平板电脑内存太少,但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库来制作带有JNI前端调用静态lib函数
  • 能够描述它吗
  • 这在JNI中可能是不可能的,然后很高兴知道这是可能的不可能的有可能以这种方式进行优化吗

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

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

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

问题是如何伪装JNI文件中未使用的函数

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

基本问题是HW Samsung Tab3的APK太大,所以它崩溃了,而HAXM工作得很好。使用一个小的JNI伪代码,我最初在Tab3中工作,但不是真正的JNI代码。我的假设是它太大了,是吗?

如果优化以其他方式可用,那么在制作动态自动JNI库时使用它来制作静态库的想法是多余的。可怕的是,在超过64K个条目中手动整理使用了什么。无论如何,谢谢你@亚历克斯。

是的,通过在应用程序渐变中设置以下标志,可以进行优化:

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,但仍然崩溃(在Main java中的load jni库命令上)。

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

问题是APK在发布模式下会有多大(我假设它比调试模式小),但发布版本必须签名等,我的意图不是向市场发布应用程序,而是测试它的大小,看看计划中的应用程序是否可能适合商业Android硬件单元。如果没有,我必须对我计划中的应用程序进行全面的重新设计,但要明智得多。但重新设计是一项艰巨的工作,我想确定最初的计划是不可能的吗?看到像微软办公软件这样的应用程序副本,我想这一定是可能的。

由于试图篡改构建/编辑风格,Gradle只是抱怨放弃了调试功能,所以这是一条死胡同。

所以现在的问题是:

在不进行商业发布的情况下,是否有可能找到并尝试发布形式的应用程序