过去两天我一直在SO和Google上搜索我的问题的解决方案,但我找不到任何解决方案。
我正在尝试在.so
中包含一个.jar
库,该库带有.so
包装器,用于本机函数。当我用winrar提取jar时,我可以看到它只包含.class
个文件 - 这是正常的吗?
我正在使用Eclipse并创建了一个新项目,并将.so
文件添加到libs/armeabi
文件夹,并将.jar
添加到我的项目中。
我已设置属性,以便将本机库位置设置为libs/armeabi
文件夹。
我还将构建选项移至Automatically refresh Resources and Assets folder on build
以及Force error when external jars contain native libraries
,但我相信第二个不是我的错误。
我正在使用此代码尝试将程序加载到手机中。
public class MainActivity extends Activity {
static {
Log.w("MYAPP", "About to load library.");
System.loadLibrary("libjdns_sd");
Log.w("MYAPP", "Library loaded.");
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.activity_main, menu);
return true;
}
}
应该通过静态块加载库。
我的LogCat会显示此输出:
11-30 18:13:47.830: W/MYAPP(9158): About to load library.
11-30 18:13:47.830: W/dalvikvm(9158): Exception Ljava/lang/UnsatisfiedLinkError; thrown while initializing Lcom/example/bonjourapple/MainActivity;
11-30 18:13:47.830: W/dalvikvm(9158): Class init failed in newInstance call (Lcom/example/bonjourapple/MainActivity;)
11-30 18:13:47.830: D/AndroidRuntime(9158): Shutting down VM
11-30 18:13:47.830: W/dalvikvm(9158): threadid=1: thread exiting with uncaught exception (group=0x41949898)
11-30 18:13:47.830: E/AndroidRuntime(9158): FATAL EXCEPTION: main
11-30 18:13:47.830: E/AndroidRuntime(9158): java.lang.UnsatisfiedLinkError: Couldn't load libjdns_sd from loader dalvik.system.PathClassLoader[dexPath=/data/app/com.example.bonjourapple-2.apk,libraryPath=/data/app-lib/com.example.bonjourapple-2]: findLibrary returned null
11-30 18:13:47.830: E/AndroidRuntime(9158): at java.lang.Runtime.loadLibrary(Runtime.java:355)
11-30 18:13:47.830: E/AndroidRuntime(9158): at java.lang.System.loadLibrary(System.java:525)
11-30 18:13:47.830: E/AndroidRuntime(9158): at com.example.bonjourapple.MainActivity.<clinit>(MainActivity.java:11)
11-30 18:13:47.830: E/AndroidRuntime(9158): at java.lang.Class.newInstanceImpl(Native Method)
11-30 18:13:47.830: E/AndroidRuntime(9158): at java.lang.Class.newInstance(Class.java:1130)
11-30 18:13:47.830: E/AndroidRuntime(9158): at android.app.Instrumentation.newActivity(Instrumentation.java:1078)
11-30 18:13:47.830: E/AndroidRuntime(9158): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2210)
11-30 18:13:47.830: E/AndroidRuntime(9158): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2349)
11-30 18:13:47.830: E/AndroidRuntime(9158): at android.app.ActivityThread.access$700(ActivityThread.java:159)
11-30 18:13:47.830: E/AndroidRuntime(9158): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1316)
11-30 18:13:47.830: E/AndroidRuntime(9158): at android.os.Handler.dispatchMessage(Handler.java:99)
11-30 18:13:47.830: E/AndroidRuntime(9158): at android.os.Looper.loop(Looper.java:137)
11-30 18:13:47.830: E/AndroidRuntime(9158): at android.app.ActivityThread.main(ActivityThread.java:5419)
11-30 18:13:47.830: E/AndroidRuntime(9158): at java.lang.reflect.Method.invokeNative(Native Method)
11-30 18:13:47.830: E/AndroidRuntime(9158): at java.lang.reflect.Method.invoke(Method.java:525)
11-30 18:13:47.830: E/AndroidRuntime(9158): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1187)
11-30 18:13:47.830: E/AndroidRuntime(9158): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1003)
11-30 18:13:47.830: E/AndroidRuntime(9158): at dalvik.system.NativeStart.main(Native Method)
为什么没有加载库?我究竟做错了什么? 如果有人能指出我正确的方向,我将非常感激。
答案 0 :(得分:2)
原则上我所要做的就是将.jar文件放入通常的libs
文件夹中,并将.so
文件放入libs/armeabi-v7a
。然后我就可以加载本机库并访问它的功能。