Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/183.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
制作一个Android Studio JNI静态库供JNI读取_Android_C++_C_Android Ndk - Fatal编程技术网

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

制作一个Android Studio JNI静态库供JNI读取,android,c++,c,android-ndk,Android,C++,C,Android Ndk,硬件手机和平板电脑内存太少,但HAXM工作正常? 我的基本问题是我的应用程序(很可能是Java应用程序加载的JNI动态库)太大。Java应用程序在没有使用硬件电话和模板调用JNI指令的情况下崩溃。不过,它与HAXM仿真器配合使用效果很好,因为HAXM仿真器只是扩大了自身的主内存 我想我需要减小JNI动态库的大小 我有大量的C函数,大多数都没有使用过? 涵盖应用程序编程的主题领域,使用了64000多个条目和995个条目。在Win32中编写C程序,链接器会过滤掉未使用的东西。真的很顺利 然而,在an

硬件手机和平板电脑内存太少,但HAXM工作正常?

我的基本问题是我的应用程序(很可能是Java应用程序加载的JNI动态库)太大。Java应用程序在没有使用硬件电话和模板调用JNI指令的情况下崩溃。不过,它与HAXM仿真器配合使用效果很好,因为HAXM仿真器只是扩大了自身的主内存

我想我需要减小JNI动态库的大小

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

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

然而,在androidstudio中,我像往常一样使用动态JNI库编写了一个Java应用程序,这是androidjni的标准用法。没有链接器来决定使用或不使用什么函数。然而,我有一个前端JNI文件,它调用其他C函数组。Java系统不分析调用了哪些JNI函数,并且发现调用树能够对其进行排序,我想?(我想WIn32中的DLL也不会这样做,因为它不知道将调用什么。)

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

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

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

  • 有人知道如何在Android Studio中创建静态JNI库吗
  • 有人知道如何在Android Studio中使用静态JNI库制作一个带有 JNI前端调用静态库函数
  • 你能描述它吗
  • 这在JNI中可能是不可能的,然后知道它是好的 不可能的。是否可以通过这种方式进行优化
您可以在Android Studio中使用静态库,但您应该使用ndk build构建它,并使用Android.mk作为配置

在build.gradle中,您可以参考此预构建库“c:\android\obj\libmystatic.a”:


问题是如何解除JNI文件中未使用函数的保护

我在@Michaels hint的帮助下回答了我自己的问题

基本问题是,对于HW三星Tab3来说,APK太大,所以它会崩溃,而HAXM工作正常。我最初使用一个小型JNI虚拟机在Tab3中工作,但不是真正的JNI代码。我的假设是它太大了,是吗

如果优化以其他方式可用,那么在创建动态自动JNI库时使用它创建静态库的想法是多余的。令人恐惧的是,要手动在超过64K个条目中找出所使用的内容。无论如何谢谢你@Alex

是,通过在应用程序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。将构建变量设置为arm7 debug(Tab3)时,APK为2,7MB,但仍然崩溃(在主java中的load jni library命令上)

我如何知道发布大小?-是否可以进行测试?

问题是APK在发布模式下会有多大(我假设它比调试模式小),但发布版本必须签署等等,我的意图不是发布应用程序上市,而是测试它的大小,看看计划中的应用程序是否可能适合商业安卓硬件单元。如果不是的话,我必须对我计划中的应用程序进行总体重新设计,但是要明智得多。但是重新设计是一项巨大的工作,我很想确定原来的计划是不可能的?看到微软办公软件拷贝这样的应用程序,我认为这一定是可能的

Gradle试图摆弄构建/编辑风格,他只是抱怨说放弃了调试功能,所以这是一条死胡同

因此,现在的问题是:


是否有可能在不进行商业发布的情况下以发行版的形式查找并试用该应用程序?

您是否尝试过将默认符号可见性设置为
隐藏
和垃圾收集未使用的代码/数据部分?看,这个问题并没有显示出任何研究成果——在我看来,1是不公平的。看,Android studio NDK的整个环境在几个月前被1.3版改变了,除了build.gradle之外,甚至看不到还有Android.mk文件。Android studio指南并没有完全更新,NDK页面也没有更新。即使不是这样,将NDK作为单独的安装运行,静态库问题在stckoverflow中也非常罕见。有关android/gradle链接器优化的信息,请告诉我在哪里可以找到它?如果您想在使用gradle构建时使用自己的android.mk,那么已经有几个问题需要解决。例如@Michael,现在我们讨论的主题是正确的,这是一条深入调查和测试的好线索。如果它们只是打开的话,看起来会有内置的优化功能(为什么默认情况下它们不存在是一个谜。它们仍然在处理android.mk和ap.mk脚本,但可能可以转换为AS1.3+gradle。让我们看看结果如何?是的@Michael,在应用程序build gradle中有一个有趣的部分:android.ndk{moduleName=“AndroidRosetta”/**此处可配置的其他ndk标志为*cppFlags+=“-fno rtti”*cppFlags+=”-fno,除了
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"
     */
}