2

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

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

API 级别为 8,如 mainfest 中所写:

<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 在编译时与项目的其余部分一起“被索引”。

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

4

4 回答 4

3

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

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

就我而言,我将 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')
}

现在一切正常。

于 2014-07-05T11:43:12.213 回答
3

这是我在 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”,否则会抛出异常。

于 2015-07-16T08:50:48.760 回答
1

我解决了将这个包中包含的源放在我的项目的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.openmobileapi.jar的 seek-for-android 库的新版本。

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

于 2013-09-20T17:57:41.790 回答
0

在 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"/>
于 2015-04-15T10:20:52.207 回答