如何解决com.google.android.gms.R $ styleable错误的java.lang.NoClassDefFoundError?

时间:2014-07-09 08:52:03

标签: android google-maps makefile google-play-services noclassdeffounderror

我在项目中使用Google地图,并使用 Android.mk 进行构建。但仍然(经过几天的研究)无法弄清楚如何解决 NoClassDefFoundError ,这会及时崩溃apk版Google Maps片段通胀。我内心可以解决一个必须解决的问题吗? Detalization在下面。

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>

1 个答案:

答案 0 :(得分:1)

问题在于,当您将依赖项目用作库时,生成的JAR(google-play-services_lib.jar)不适合独立使用(作为java静态库)。解决方案简单地使用Eclipse导出生成的JAR,而不是以下列方式导出&gt; Java&gt;带有选定 src gen 文件夹的JAR文件enter image description here

以下代码段有助于定义 com.google.android.gms.R 和嵌套类不可用(com.google.android.gms.R $ attr,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(使用src文件夹类。请参阅文件夹&#34; android&#34;下面): enter image description here

如何为强大的静态库打包JAR(使用src和gen文件夹类。请参阅文件夹&#34; android&#34;以及&#34; com&#34;下面): enter image description here

然而,在使用Eclipse导出轻量级黑客的惯用右解决方案成为GTD之前。使用google-play-services_lib / bin / classes 内容简单重新打包google-play-services_lib.jar,之前提供的内容使所有资源类都可用。