У меня есть оператор журнала печати в JNI_OnLoad, но я обнаружил, что он не вызывается. Вот мой метод JNI_OnLoad.onJNILoad не вызывается при вызове System.loadLibrary
extern "C" JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM* vm, void* reserved) {
__android_log_print(ANDROID_LOG_INFO, __FUNCTION__, "onLoad");
// some init code
}
мне нужно объявить JNI_OnLoad в определенном файле или объявить в Android.MK н сообщает системе, где найти метод JNI_OnLoad ли? Теперь я просто поместил один из многих .cpp-файлов.
сборник .so lib прилагается. Я пытаюсь сбрасывать такой файл, и я уверен, что метод JNI_OnLoad экспортируется. https://docs.google.com/file/d/0B089WeEZXTb3ZjZiQllaYThuUUk/edit
На самом деле, я пытаюсь передать библиотеку из источника android (libcorejava.so). Чтобы избежать конфликта классов, я уже меняю путь к классу.
А вот файл, который объявляет JNI_OnLoad: https://android.googlesource.com/platform/libcore/+/master/luni/src/main/native/Register.cpp Я уже изменить подпись на один выше, чтобы соответствовать стандартной подписи
EDIT: Я обнаружил, что андроид источник не загружает его по System.loadLibrary! Он говорит, что libcorejava используется для реализации System.loadLibrary, поэтому мы не можем использовать System.loadLibrary для его загрузки. Но в моем случае это не должно быть проблемой, так как мне нужна часть функции (связанная с ОИТ).
https://android.googlesource.com/platform/dalvik/+/master/vm/Init.cpp
// Most JNI libraries can just use System.loadLibrary, but you can't
// if you're the library that implements System.loadLibrary!
loadJniLibrary("javacore");
loadJniLibrary("nativehelper");
EDIT 2:
Оказывается, что это происходит потому, что конфликт имен библиотеки! Но, похоже, для libjavacore требуется другая библиотека. Есть ли какой-либо инструмент, который может указать, что я не имею в виду?
java.lang.UnsatisfiedLinkError: Cannot load library: reloc_library[1286]: XXX
EDIT 3:
TextClock новый API для отображения времени. Он существует только в 4.2+ api. Я пытаюсь сделать это, чтобы старший sdk мог его использовать. Это зависит от библиотеки ICU, которая находится в libjavacore. Поэтому я модифицирую файл Android.mk, чтобы убедиться, что libjavacore включает только исходный файл, связанный с icu, и окончательный скомпилированный файл, который будет включен в мой apk.
TextClock:
http://developer.android.com/reference/android/widget/TextClock.html
Он теперь работает в телефоне, который изначально поддерживает TextClock, но не работает в старых устройствах. Вот журнал исключений. Я думаю, это потому, что libjavacore является оберткой библиотеки ICU. Помимо обертки мне все равно нужно портировать библиотеку ICU. Но я собираюсь отказаться, как размер библиотеки ICU довольно большой и, кажется, не стоит за это ...
12-13 14:07:54.859: E/AndroidRuntime(2091): java.lang.UnsatisfiedLinkError: Cannot load library: reloc_library[1306]: 36 cannot locate '_ZN6icu_516Locale14createFromNameEPKc'...
12-13 14:07:54.859: E/AndroidRuntime(2091): at java.lang.Runtime.loadLibrary(Runtime.java:370)
12-13 14:07:54.859: E/AndroidRuntime(2091): at java.lang.System.loadLibrary(System.java:535)
12-13 14:07:54.859: E/AndroidRuntime(2091): at com.example.time.MainActivity.onCreate(MainActivity.java:20)
12-13 14:07:54.859: E/AndroidRuntime(2091): at android.app.Activity.performCreate(Activity.java:5008)
12-13 14:07:54.859: E/AndroidRuntime(2091): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1079)
12-13 14:07:54.859: E/AndroidRuntime(2091): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2023)
12-13 14:07:54.859: E/AndroidRuntime(2091): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2084)
12-13 14:07:54.859: E/AndroidRuntime(2091): at android.app.ActivityThread.access$600(ActivityThread.java:130)
12-13 14:07:54.859: E/AndroidRuntime(2091): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1195)
12-13 14:07:54.859: E/AndroidRuntime(2091): at android.os.Handler.dispatchMessage(Handler.java:99)
12-13 14:07:54.859: E/AndroidRuntime(2091): at android.os.Looper.loop(Looper.java:137)
12-13 14:07:54.859: E/AndroidRuntime(2091): at android.app.ActivityThread.main(ActivityThread.java:4745)
12-13 14:07:54.859: E/AndroidRuntime(2091): at java.lang.reflect.Method.invokeNative(Native Method)
12-13 14:07:54.859: E/AndroidRuntime(2091): at java.lang.reflect.Method.invoke(Method.java:511)
12-13 14:07:54.859: E/AndroidRuntime(2091): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786)
12-13 14:07:54.859: E/AndroidRuntime(2091): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
12-13 14:07:54.859: E/AndroidRuntime(2091): at dalvik.system.NativeStart.main(Native Method)
Включение его в один из многих файлов cpp в порядке. Я не знаю, в чем проблема, но я уверен, что это не причина. Единственное, что приходит мне на ум, это то, что вы забыли поставить extern «C» перед функцией. – eozgonul
У меня нету. Зачем это нужно? – Bear
http://stackoverflow.com/a/1041880/2359247 – eozgonul