【问题标题】:Android 4: Failed resolving class from org.simalliance.openmobileapi packageAndroid 4:无法从 org.simalliance.openmobileapi 包中解析类
【发布时间】:2013-09-20 09:39:22
【问题描述】:

我正在开发利用 org.simalliance.openmobileapi API 来使用安全元素通信的应用程序。

应用是Native即主Activity调用一个JNI库进行操作。 JNI库使用JNI Method调用org.simalliance.openmobileapi包的函数。

API 级别在 mainfest 中为 8:

<uses-sdk android:minSdkVersion="8" android:targetSdkVersion="8"/>

该应用程序在 Android 2.3.6 上运行良好,但是当我尝试从 Android 4.0.4 或更高版本启动该应用程序时,该应用程序找不到 org.simalliance.openmobileapi 的 SEService 类。有用的日志是:

09-20 11:00:48.509: I/dalvikvm(1104): Failed resolving Lpkg/wrapper/SecureChannel; interface 203 'Lorg/simalliance/openmobileapi/SEService$CallBack;'
09-20 11:00:48.509: W/dalvikvm(1104): Link of class 'Lpkg/wrapper/SecureChannel;' failed
01-01 22:08:33.460: I/dalvikvm(10881): java.lang.NoClassDefFoundError: org.simalliance.openmobileapi.SEService$1

SecureChannel 类是由 JNI 调用以对安全元素进行操作的 Java 类,它包含在一个 jar 中,该 jar 在编译时与项目的其余部分一起“被索引”。

包 org.simalliance.openmobileapi.jar 在两个版本的 Android 中都包含在 /system/framework 文件夹中:

在 Android 2.3.6 上

-rw-r--r-- root     root        29148 2012-11-15 11:24 org.simalliance.openmobileapi.jar

在 Android 4.0.4 上

-rw-r--r-- root     root          313 2012-06-11 15:49 org.simalliance.openmobileapi.jar
-rw-r--r-- root     root        24864 2012-06-11 15:49 org.simalliance.openmobileapi.odex

我看到的唯一区别是 Android 4.0.4 操作系统中的 odex 文件。 有没有办法包含类路径或对 /system/framework 文件夹中包含的包的引用?

【问题讨论】:

    标签: java android c++ java-native-interface noclassdeffounderror


    【解决方案1】:

    我找到了一个干净的解决方案。

    不要告诉编译器您要将库编译到您的应用程序中,只需说该库是为您的应用程序提供的,一切都会正常工作。

    在我的例子中,我将 Gradle 与 Android Studio 一起使用。

    所以我只是从我的 SDK 路径中下载的插件中提取 .jar 文件:

    sdk\add-ons\addon-open_mobile_api-giesecke_devrient_gmbh-18\libs

    并将它放在我的应用程序库文件夹中。 然后在我的 build.gradle 文件中我替换了:

    dependencies {
        compile files('libs/org.simalliance.openmobileapi.jar')
    }
    

    有了这个:

    dependencies {
        provided files('libs/org.simalliance.openmobileapi.jar')
    }
    

    现在一切正常。

    【讨论】:

      【解决方案2】:

      这是我在 Android Studio 中的配置

      在 app/build.gradle 中

      dependencies {
          compile fileTree(include: ['*.jar'], exclude: ['org.simalliance.openmobileapi.jar'], dir: 'libs')
          provided files('libs/org.simalliance.openmobileapi.jar')
      }
      

      在 AndroidManifest.xml 中,将其设置为 true 或 false 取决于您

          <uses-library
              android:name="org.simalliance.openmobileapi"
              android:required="false" />
      

      在 /system/framwork/ 中,“org.simalliance.openmobileapi.jar”是必需的,否则会抛出异常。

      【讨论】:

      【解决方案3】:

      我解决了在我的项目的 src/ 文件夹中放置此包中包含的源代码的问题:

      http://code.google.com/p/seek-for-android/downloads/detail?name=MSC%20Smartcard%20Service%203.0.tar.gz&can=2&q=

      更准确地说是包 com.mobilesecuritycard.openmobileapi.jar 中的源代码,它是用于替换旧包 org.simalliance 的 seek-for-android 库的新版本。 openmobileapi.jar.

      我不得不将所有对包的引用从 com.mobilesecuritycard 重命名为 org.simalliance,因为 SecureChannel 类是用旧包编写的,所以旧包名必须使用。

      【讨论】:

      • 感谢分享这个,我实际上面临同样的问题(但是当我使用 Giesecke & Devrient GmbH:Open Mobile API:18 build SDK version String 而不是 18 时它可以工作),我会尝试你的解决方案。您是否设法使用 SmartCard API v.3.0.1 做同样的事情?
      【解决方案4】:

      在 android manifest 中不要忘记添加:

      <application
              android:name=....
              android:icon="@drawable/icon"
              android:label="@string/app_name" 
              android:allowBackup = "true" >
      
              <!-- support USIM -->
              <uses-library
                      android:name="org.simalliance.openmobileapi"
                      android:required="false"/>
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-11-11
        • 1970-01-01
        • 2017-02-02
        • 2015-11-22
        • 2018-11-26
        • 2012-12-06
        • 2019-01-14
        • 2021-12-24
        相关资源
        最近更新 更多