Android 4:无法解析org.simalliance.openmobileapi包中的类

时间:2013-09-20 09:39:22

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

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

应用程序是Native,它是主要的Activity调用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

类Sec​​ureChannel是一个Java类,由JNI调用以对安全元素进行操作,并包含在一个jar中,该jar在编译时与项目的其余部分“dexed”。

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

4 个答案:

答案 0 :(得分:3)

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

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

在我的情况下,我使用Gradle和Android studio。

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

  

SDK \插件\插件-open_mobile_api-giesecke_devrient_gmbh-18 \库

并将其放在我的应用程序li​​bs文件夹中。 然后在我的build.gradle文件中,我替换了:

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

用这个:

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

现在一切正常。

答案 1 :(得分: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 /,&#34; org.simalliance.openmobileapi.jar&#34;是必需的,否则会抛出异常。

答案 2 :(得分: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的新版本的seek-for-android库。 openmobileapi.jar

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

答案 3 :(得分:0)

在android清单中不要忘记添加:

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