簡體   English   中英

如何解決com.google.android.gms.R $ styleable錯誤的java.lang.NoClassDefFoundError?

[英]How to solve java.lang.NoClassDefFoundError for com.google.android.gms.R$styleable error?

我在一個項目中使用Google Maps,並使用Android.mk進行構建。 但是,仍然(經過幾天的研究)仍無法弄清楚如何解決NoClassDefFoundError ,該錯誤會在Google Maps片段膨脹發生時使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);

版面

<?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>

問題在於,當您將依賴項目用作庫時,生成的JAR(google-play-services_lib.jar)不適合獨立使用(如java靜態庫)。 作為解決方案,請簡單地使用Eclipse導出生成的JAR,而不要采用以下方式導出:帶有選擇的srcgen文件夾的Export> Java> JAR文件進行導出: 在此處輸入圖片說明

以下代碼段有助於定義com.google.android.gms.R和嵌套類不可用(com.google.android.gms.R $ attr,com.google.android.gms.R $ color等):

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

如何為依賴項項目打包JAR(帶有src文件夾類。請參見下面的文件夾“ android”): 在此處輸入圖片說明

如何為健壯的靜態庫打包JAR(帶有src和gen文件夾類。請參見下面的文件夾“ android”和“ com”): 在此處輸入圖片說明

但是,在使用Eclipse導出輕技巧的習慣上正確的解決方案之前,它已經成為GTD。 使用google-play-services_lib / bin / classes內容簡單地重新打包google-play-services_lib.jar並先前在其中顯示內容,可以使用所有資源的類。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM