2015-11-30 2 views
-1

Слишком мало памяти в телефонах и планшетах HW, но HAXM отлично работает?Создание Android Studio JNI static lib для чтения JNI

Основная проблема заключается в том, что мое приложение (скорее всего, динамическая библиотека JNI, загруженное моим Java-приложением) слишком велико. Приложение Java падает без вызова инструкций JNI с использованием HW-телефонов и шаблонов. Однако он отлично работает с эмулятором HAXM, который просто увеличивает первичную память.

Как я полагаю, мне нужно уменьшить размер динамической библиотеки JNI.

У меня есть огромное количество C-функций, большинство из них не используются?

При использовании тематической области прикладного программирования используется более 64000 записей и 995. Создание C-программы в Win32 фильтра компоновщика неиспользуемого материала. Настоящий плавный.

Тем не менее, в Android Studio у меня, как обычно, приложение Java, написанное с использованием динамической библиотеки JNI, используемой стандартным для Android JNI. Нет линкера, который определяет, какие функции используются или нет. Однако у меня есть интерфейсный JNI-файл, который вызывает другую группу C-функций. Система Java не анализирует, какие функции JNI вызываются и находят дерево вызовов, способных их сортировать, я предполагаю? (И не будет DLL в WIn32, потому что он не знает, что будет называться, я предполагаю.)

Статический метод lib может работать, как мне это сделать?

Одна из идей заключается в создании статической библиотеки огромного количества C-функций, и когда стандартный JNI для Android использует ее по вызовам из JNI-файла, я предполагаю, что это будет использовать только функции статического необходима библиотека и отбросить все остальное, например, при подключении к C-программе Win32. Я могу быть не прав?

Ну, я попытался выяснить, как сделать статическую библиотеку в Android Studio, а также как использовать проприетарную статическую библиотеку lib для связи в динамической библиотеке JNI. Тем не менее, очень сложно выяснить, как искать или искать в stackoverflow. Я предполагаю, что этот подход встречается редко.

  • Кто-нибудь знает, как сделать статический JNI LIB в Android Studio
  • Кто-нибудь знает, как использовать статический JNI LIB в Android Studio делает Android приложения с JNI переднего конца вызывающего статическую LIB функции?
  • И способен ли это описать?
  • Возможно, это невозможно в JNI, и тогда хорошо знать, что это невозможно. Можно ли сделать эту оптимизацию таким образом?
+0

Вы пытались установить видимость символа по умолчанию на 'hidden 'и сбор мусора, который не использовался в разделе кода/данных? См. Https://blog.algolia.com/android-ndk-how-to-reduce-libs-size/ – Michael

+0

Этот вопрос не показывает каких-либо исследований -1 нечестен на мой взгляд. Послушайте, вся среда Android NDK изменилась на версию 1.3 несколько месяцев назад, даже не вижу, что есть файл android.mk, но build.gradle. Руководство для студии Android на самом деле не полностью обновлено, а страницы NDK - нет. Даже если нет, запуск NDK в качестве отдельных установок, статические проблемы с lib очень редки в stckoverflow. Информация об оптимизации компоновщика android/gradle, скажите мне, где его найти? –

+0

Если вы хотите использовать свой Android.mk при построении с Gradle, есть несколько вопросов о том, как это сделать. Например. http://stackoverflow.com/questions/32970094/how-to-use-custom-android-mk-with-new-gradle-build-system – Michael

ответ

0

Вы можете использовать статическую библиотеку в Android Studio, но вы должны построить его с НДК-строить используя Android.mk в конфигурации.

В вашей сборке.gradle вы можете обратиться к этой предварительно построенной библиотеке «c: \ android \ obj \ libmystatic.А ":

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

Вопрос заключается в том, как disguard неиспользуемые функции в JNI файл

Ну я отвечаю на свой вопрос с помощью @Michaels намека

Основная проблема. слишком большой APK для HW Samsung Tab3, поэтому он сбой, в то время как HAXM отлично работает. Используя небольшой манекен JNI, я изначально делал работы в Tab3, но не в реальном коде JNI. Я полагаю, что он слишком велик, не так ли?

Идея создания статической библиотеки, использующей ее при создании динамического автоматического JNI lib, избыточна, если оптимизация доступна другими способами. Ужас состоит в том, чтобы вручную определить, что используется среди более чем 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 до 7Мб (удаление неиспользуемых функций в части JNI). И некоторые изменения в приложении, уменьшив приложение Win64 от 0,9 МБ до 0,6 Мб, сократив APK до 6 Мб. Настройка варианта сборки для отладки arm7 (Tab3) APK составляет 2,7 МБ, но все еще сбой (в команде загрузки jni-библиотеки в Главном java).

Как узнать размер выпуска? - Можно ли проверить?

Проблема заключается в том, насколько большой APK будет в режиме выпуска (у меня есть предположение, что он меньше, чем режим отладки), но выпуск версии должен быть подписан и т. Д., И мое намерение не выпускает приложение для рынка, но тестирует размер из этого, посмотрите, может ли планируемое приложение поместиться в коммерческое устройство Android HW. Если нет, я должен сделать общий редизайн моего запланированного приложения, но, тем не менее, намного мудрее. Но перепроектирование - огромная работа, и я предпочитаю быть уверенным, что первоначальный план был невозможным? Видя приложения, подобные копиям MS Office, я предположил, что это возможно.

Будучи пытающимся возиться с элементами Build/Edit, Gradle просто жалуется на то, чтобы отложить возможности отладки, так что это был тупик.

Так настоящий вопрос:

Есть ли возможность узнать и попробовать приложение в форме выпуска без коммерчески освободив его?

+0

Новые вопросы должны быть отправлены как вопросы, а не как ответы. – Michael

+0

Я нашел Я ошибался в том, почему мое приложение вылетает из блоков ARM7 HW, а не в HAXM (это не проблема памяти). Это произошло из-за проблемы с stdlib atof (изменил его на strtod и загрузил), что сделало загрузку коллапса в библиотеке JNI. См. Https://code.google.com/p/android/issues/detail?id=73725). Теперь у меня есть другая проблема с ARM7 JNI. Тем не менее, меня все еще интересует вопрос: «Есть ли возможность узнать и попробовать приложение в форме выпуска без его коммерческого освобождения?» –

+1

.., который является новым вопросом и поэтому должен быть опубликован как таковой. – Michael

Смежные вопросы