我正在开发使用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
类SecureChannel是一个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文件夹中包含的包中?
答案 0 :(得分:3)
我找到了解决这个问题的干净方案。
不要对编译器说你想要将库编译到你的应用程序中,只要说库是为你的应用程序提供的,一切都会正常工作。
在我的情况下,我使用Gradle和Android studio。
所以我只是从SDK路径中下载的附加组件中提取.jar文件:
SDK \插件\插件-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')
}
现在一切正常。
答案 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 / 文件夹放在此包中包含的来源的问题:
更确切地说,包中的源代码 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"/>