1

Я использую Карты Google в проекте и строю его с Android.mk. Но все же (после нескольких дней исследований) cann't выяснить, как решить NoClassDefFoundError, который вредит apk вовремя. Может ли кто-нибудь внутри меня о том, как это нужно решить? Детальность ниже.

Google Play библиотека Услуги добавлена ​​следующим образом:

#Adding classpath to Google Play Services classes 
LOCAL_CLASSPATH += $(LOCAL_PATH)/google-play-services_lib/bin/ 
... 
#Google Play Services 
LOCAL_STATIC_JAVA_LIBRARIES += google-play-services \ 
           google-play-services_lib 
... 
LOCAL_PREBUILT_STATIC_JAVA_LIBRARIES += google-play-services:libs/google-play-services.jar \ 
             google-play-services_lib:libs/google-play-services_lib.jar 

Сложение идет хорошо, но приложение выдает ошибку во время выполнения, когда пытается раздуть макет с Google Maps фрагмента. LogCat:

**java.lang.NoClassDefFoundError**: 
java.lang.NoClassDefFoundError: com.google.android.gms.R$styleable 
    at com.google.android.gms.maps.GoogleMapOptions.createFromAttributes(Unknown Source) 
    at com.google.android.gms.maps.MapFragment.onInflate(Unknown Source) 
    at android.app.Activity.onCreateView(Activity.java:4996) 
    at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:695) 
    at android.view.LayoutInflater.rInflate(LayoutInflater.java:761) 
    at android.view.LayoutInflater.rInflate(LayoutInflater.java:769) 
    at android.view.LayoutInflater.inflate(LayoutInflater.java:498) 
    at android.view.LayoutInflater.inflate(LayoutInflater.java:398) 
    at android.view.LayoutInflater.inflate(LayoutInflater.java:354) 
    at com.mapsvisitor.ui.MapsFragment.onCreateView(MapsFragment.java:81) 
    ... 

Код:

final View layout = inflater.inflate(R.layout.maps_layout, null); 

Layout:

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/map_main" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:orientation="vertical"> 
     <fragment 
      android:id="@+id/map" 
      android:layout_width="match_parent" 
      android:layout_height="match_parent" 
      class="com.google.android.gms.maps.MapFragment" /> 
</LinearLayout> 
+1

Похоже, вы не указали правильные сервисы Google Play – Raghunandan

+0

Это выглядит так. Но утилиты Google Play Services возвращают ** True ** для запроса 'isGooglePlayServicesAvailable'. У вас есть идеи, как ссылаться на него в make-файле? –

+0

Можете ли вы правильно проверить, если вы ссылаетесь на сервисы Google Play. На вашем устройстве могут быть установлены google play servicesa apk, но вы указали то же самое в своем проекте? – Raghunandan

ответ

1

Проблема заключается в том, что при использовании зависимостей проекта в качестве библиотеки сгенерированный JAR (google-play-services_lib.jar) не подходит для самостоятельного использования (как j ava). В качестве решения простого использования JAR генерируемой экспорта Eclipse, а не следующим образом Экспорт> Java> JAR файл с выбранным ЦСИ и генераторных папки для экспорта: enter image description here

Следующий фрагмент кода позволяет определить, что ком .google.android.gms.R и вложенные классы недоступны (com.google.android.gms.R $ атр, com.google.android.gms.R $ цвет, и т.д.):

void isClassesAvailable(List<String> classes) { 
    for(String cl: classes) { 
     try { 
      Class.forName(cl); 
     } 
      catch (ClassNotFoundException e) { 
      Log.w(TAG, e.getMessage()); 
     } 
    } 
} 

Как JAR упакован для зависимости project (с классами папок src. Смотрите папку «андроид» ниже): enter image description here

Как JAR должно быть упакованы для надежной статической библиотеки (с Src и генераторной папкой классами См папки «андроид» и «ком» ниже):. enter image description here

Однако перед идиоматически правильным решением, которое использует Eclipse export light hack, становится GTD. Простой переупаковка google-play-services_lib.jar с содержимым google-play-services_lib/bin/classes и ранее представленными там, все классы ресурсов доступны.

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