Java — Android 4: не удалось разрешить класс из пакета org.simalliance.openmobileapi

Я работаю над приложением, которое использует API org.simalliance.openmobileapi для использования защищенного элемента связи.

Приложение Native, которое является основным вызовом Activity для работы библиотеки JNI. Библиотека JNI использует метод JNI для вызова функций пакета org.simalliance.openmobileapi.

Уровень API равен 8, как записано в mainfest:

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

Приложение работает нормально с Android 2.3.6, но когда я пытаюсь запустить приложение с Android 4.0.4 или более поздней версии, приложение не может найти класс SEService org.simalliance.openmobileapi. Полезные журналы:

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, который «dexed» во время компиляции с остальной частью проекта.

Пакет org.simalliance.openmobileapi.jar находится в папке / system / framework в обеих версиях Android:

На 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

Единственное отличие, которое я вижу, — это файл odex в ОС Android 4.0.4.
Есть ли способ включить classpath или ссылку на пакет, содержащийся в папке / system / framework?

2

Решение

Я нашел чистое решение этой проблемы.

Вместо того чтобы сказать компилятору, что вы хотите скомпилировать библиотеку в ваше приложение, просто скажите, что библиотека предоставлена ​​для вашего приложения, и все будет работать нормально.

В моем случае я использую Gradle с Android studio.

Поэтому я просто извлекаю файл .jar из загруженного дополнения в моем пути SDK:

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')
}

И теперь все работает просто отлично.

3

Другие решения

Вот моя настройка в Android Studio

в приложении / 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» требуется, или возникнет исключение.

2

Я решил проблему надеть SRC / Папка моего проекта, источник которого содержится в этом пакете:

http://code.google.com/p/seek-for-android/downloads/detail?name=MSC%20Smartcard%20Service%203.0.tar.gz&может = 2&д =

Точнее источник в упаковке com.mobilesecuritycard.openmobileapi.jar которая является новой версией библиотеки поиска для Android, сделанной для замены старого пакета org.simalliance.openmobileapi.jar.

Я должен был переименовать всю ссылку на пакет из com.mobilesecuritycard в org.simalliance потому что класс SecureChannel был написан со старым пакетом, поэтому необходимо использовать старое имя пакета.

1

В манифесте 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"/>
0
По вопросам рекламы [email protected]