繁体   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