我在JNI_OnLoad中添加了一个打印日志语句,但发现它没有被调用。这是我的JNI_OnLoad方法。
我需要在特定的文件中声明JNI_OnLoad,或者在Android.MK中声明某些内容告诉系统在哪里找到JNI_OnLoad方法吗?现在我只是将其放在众多的.cpp文件之一。
已附编译的.so库。我尝试转储so文件,并确保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 我已经更改签名以匹配标准签名。
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库。我尝试转储so文件,并确保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 我已经更改签名以匹配标准签名。
编辑: 我发现Android源代码不会通过System.loadLibrary来加载它!它说libcorejava用于实现System.loadLibrary,因此我们不能使用System.loadLibrary来加载它。但在我的情况下,这应该不是问题,因为我只需要部分功能(与ICU相关)。
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");
编辑2:
事实证明这是因为库的名称冲突!但是似乎libjavacore需要其他库。是否有工具可以列出我缺少的依赖项?
java.lang.UnsatisfiedLinkError: Cannot load library: reloc_library[1286]: XXX
编辑3:
TextClock是一种新的API,用于显示时间。它仅存在于4.2+ API及以上版本中。我正在尝试将其向后移植,以便旧的SDK可以使用它。它依赖于一个ICU库,该库位于libjavacore中。因此,我修改了Android.mk文件,以确保libjavacore只包含与ICU相关的源文件,并且最终编译的so文件被包含在我的apk中。
TextClock:
http://developer.android.com/reference/android/widget/TextClock.html
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)