Android 4:解析来自 org.simalliance.openmobileapi 包的类失败

Android 4: Failed resolving class from org.simalliance.openmobileapi package

本文关键字:openmobileapi simalliance 失败 org Android      更新时间:2023-10-16

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

应用程序是本机的,是调用 JNI 库进行操作的主要活动。JNI 库使用 JNI 方法来调用 org.simalliance.openmobileapi 包的函数。

在主函数中写入的 API 级别为 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 是一个 Java 类,由 JNI 调用以在安全元素上运行,并包含在一个 jar 中,该 jar 在编译时与项目的其余部分一起"dexed"。

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

在安卓 2.3.6 上

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

在安卓 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 文件夹中包含的包的引用?

我找到了解决这个问题的干净解决方案。

不要对编译器说你想将库编译到你的应用程序中,而只是说库是为你的应用程序提供的,一切都会正常工作。

就我而言,我将Gradle与Android studio一起使用。

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

SDK\add-ons\adddon-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')
}

现在一切正常。

这是我

在Android Studio中的配置

In app/build.gradle

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

在AndroidManifest中.xml,变真或假取决于你

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

在/system/framwork/中,"org.simalliance.openmobileapi.jar"是必需的,否则将引发异常。

我解决了将这个包中包含的源代码放在我的项目的 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这是新版本的seek-for-android库,用于取代旧的软件包org.simalliance.openmobileapi.jar

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

在安卓

清单中不要忘记添加:

<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"/>