从本机库调用方法时出现 UnsatisfiedLinkError 尽管 System.loadLibrary 似乎没问题
UnsatisfiedLinkError when calling method from native library although System.loadLibrary seems ok
我有一个 Android Studio 1.2.2 项目设置,在项目 -> src -> main -> jniLibs -> armeabi 中包含一些原生 *.so 文件(这是它们的正确架构)。我有一个 class 以静态方式加载库并链接到本机方法(我 think/hope)。
这是 System.loadLibrary 的静态:
static {
try {
System.loadLibrary("<SOME LIB>");
} catch(UnsatisfiedLinkError ule){
Log.e(TAG, "Error while loading library <SOME LIB>", ule);
}
}
我从未遇到过捕获块或看到错误消息,但我已经验证我输入了静态并到达 System.loadLibrary 行,所以我不认为我在加载它时遇到问题。
我把这个导入另一个 class:
import com.<rest-of-pacakage-name>.<SOME LIB>
并且有一个本地方法初始化需要一个字节:
public native static int <SOME LIB>_Initialize(byte[] Parameter);
这完全基于我正在通过 AS 移植的另一个 eclipse 项目。
任何 ideas/suggestions 或方法我可以确定库加载似乎正常但方法调用不正常的根本原因?
07-22 08:38:51.810 27119-27119/com.<rest-of-package-name>.staging E/art﹕ No implementation found for int com.<rest-of-package-name>.pppp_api.PPPP_APIs.PPPP_Initialize(byte[]) (tried Java_com_<rest-of-package-name>_pppp_1api_PPPP_1APIs_PPPP_1Initialize and Java_com_<rest-of-package-name>_pppp_1api_PPPP_1APIs_PPPP_1Initialize___3B)
07-22 08:38:52.360 27119-27119/com.<rest-of-package-name>.staging E/AndroidRuntime﹕ FATAL EXCEPTION: main
Process: com.<rest-of-package-name>.staging, PID: 27119
java.lang.UnsatisfiedLinkError: No implementation found for int com.<rest-of-package-name>.pppp_api.PPPP_APIs.PPPP_Initialize(byte[]) (tried Java_com_<rest-of-package-name>_pppp_1api_PPPP_1APIs_PPPP_1Initialize and Java_com_<rest-of-package-name>_pppp_1api_PPPP_1APIs_PPPP_1Initialize___3B)
at com.<rest-of-package-name>.pppp_api.PPPP_APIs.PPPP_Initialize(Native Method)
at com.<rest-of-package-name>.ui.base.BaseDrawerActivity.setupDrawer(BaseDrawerActivity.java:150)
at com.<rest-of-package-name>.ui.base.BaseDrawerActivity.onCreate(BaseDrawerActivity.java:99)
at com.<rest-of-package-name>.ui.main.MainActivity.onCreate(MainActivity.java:15)
at android.app.Activity.performCreate(Activity.java:6221)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1119)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2614)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2726)
at android.app.ActivityThread.access0(ActivityThread.java:172)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1421)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:145)
at android.app.ActivityThread.main(ActivityThread.java:5835)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1399)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1194)
包含静态和本机方法的 class 的程序包名称:
package com.<rest-of-package-name>.pppp_api;
1) 如果您更改包含本机方法的 class 包名称,您应该更改本机代码中的方法签名。
2) 尝试再创建一个名为 armeabi-v7a 的 fodler 并将 *.so 复制到那里,因为某些设备不能使用旧的 armeabi 并忽略该 fodler 中的库
3) 在模块 gradle 脚本中,在 "android" 块中添加以下行:
sourceSets.main {
jni.srcDirs = []
jniLibs.srcDir 'src/main/jniLibs'
}
我有一个 Android Studio 1.2.2 项目设置,在项目 -> src -> main -> jniLibs -> armeabi 中包含一些原生 *.so 文件(这是它们的正确架构)。我有一个 class 以静态方式加载库并链接到本机方法(我 think/hope)。
这是 System.loadLibrary 的静态:
static {
try {
System.loadLibrary("<SOME LIB>");
} catch(UnsatisfiedLinkError ule){
Log.e(TAG, "Error while loading library <SOME LIB>", ule);
}
}
我从未遇到过捕获块或看到错误消息,但我已经验证我输入了静态并到达 System.loadLibrary 行,所以我不认为我在加载它时遇到问题。
我把这个导入另一个 class:
import com.<rest-of-pacakage-name>.<SOME LIB>
并且有一个本地方法初始化需要一个字节:
public native static int <SOME LIB>_Initialize(byte[] Parameter);
这完全基于我正在通过 AS 移植的另一个 eclipse 项目。
任何 ideas/suggestions 或方法我可以确定库加载似乎正常但方法调用不正常的根本原因?
07-22 08:38:51.810 27119-27119/com.<rest-of-package-name>.staging E/art﹕ No implementation found for int com.<rest-of-package-name>.pppp_api.PPPP_APIs.PPPP_Initialize(byte[]) (tried Java_com_<rest-of-package-name>_pppp_1api_PPPP_1APIs_PPPP_1Initialize and Java_com_<rest-of-package-name>_pppp_1api_PPPP_1APIs_PPPP_1Initialize___3B)
07-22 08:38:52.360 27119-27119/com.<rest-of-package-name>.staging E/AndroidRuntime﹕ FATAL EXCEPTION: main
Process: com.<rest-of-package-name>.staging, PID: 27119
java.lang.UnsatisfiedLinkError: No implementation found for int com.<rest-of-package-name>.pppp_api.PPPP_APIs.PPPP_Initialize(byte[]) (tried Java_com_<rest-of-package-name>_pppp_1api_PPPP_1APIs_PPPP_1Initialize and Java_com_<rest-of-package-name>_pppp_1api_PPPP_1APIs_PPPP_1Initialize___3B)
at com.<rest-of-package-name>.pppp_api.PPPP_APIs.PPPP_Initialize(Native Method)
at com.<rest-of-package-name>.ui.base.BaseDrawerActivity.setupDrawer(BaseDrawerActivity.java:150)
at com.<rest-of-package-name>.ui.base.BaseDrawerActivity.onCreate(BaseDrawerActivity.java:99)
at com.<rest-of-package-name>.ui.main.MainActivity.onCreate(MainActivity.java:15)
at android.app.Activity.performCreate(Activity.java:6221)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1119)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2614)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2726)
at android.app.ActivityThread.access0(ActivityThread.java:172)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1421)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:145)
at android.app.ActivityThread.main(ActivityThread.java:5835)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1399)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1194)
包含静态和本机方法的 class 的程序包名称:
package com.<rest-of-package-name>.pppp_api;
1) 如果您更改包含本机方法的 class 包名称,您应该更改本机代码中的方法签名。
2) 尝试再创建一个名为 armeabi-v7a 的 fodler 并将 *.so 复制到那里,因为某些设备不能使用旧的 armeabi 并忽略该 fodler 中的库
3) 在模块 gradle 脚本中,在 "android" 块中添加以下行:
sourceSets.main {
jni.srcDirs = []
jniLibs.srcDir 'src/main/jniLibs'
}