创build产品SDK:如何添加本机库(.so)和我正在创build的SDK的jar包?

我正在创build一个我们将提供给开发人员最终用户的小部件,它包含一个.jar和使用NDK构build的本地库( .so )。 JAR具有到dynamic库的JNI接口。

如何在项目中包含一个外部的.jar非常清楚,而不是如何包含一个依赖的dynamic库。

  1. 如何打包并生成.jar.so ? 这里最好的做法是什么?

  2. 我可以使用JDK的jar命令创buildJAR文件。 我需要在jar上运行dx.bat来转换为Dalvik字节码吗?

  3. 我需要创build一个示例项目来显示小部件的操作。 如何在演示如何使用小部件的示例项目中包含这个.jar.so

我花了一些时间在这个,我只是不明白为什么不写在维基文档….无论如何跟随这个变化!

  • 去windows / preferences / android / build
  • 取消第一个和第二个选项
  • 使用winrar从wikitudesdk.jar中提取文件,就好像它是一个档案,searchlibarchitect.so并将其复制到/ libs / libs / armeabi /
  • 将wikitudesdk.jar添加到您的构buildpath

在这里输入图像说明

您应该使用SDK附带的标准构build工具。 如果在项目的/lib目录中包含需要的.jar文件,ant构build过程会将包含的类文件转换为Dalvik字节码格式,并将其包含在应用程序的classes.dex文件中。 将一个build.properties文件添加到您的项目根目录中,只需一行:

external.libs.dir=lib

根据您的SDK的版本和configuration,您可能需要将jar放在libs而不是lib

至于.so,我认为它是使用Android NDK正确编译的,或者是使用一个构build脚本,使用正确的编译器和编译器标记,这些标记是成功链接Android上的共享对象所必需的。 如果是这种情况,你可以在libs/armeabi包含.so文件,并将它们添加到jar中。 而且,当你真正尝试从Java代码加载库时,dynamic库加载器将会知道在.jar中的这个位置。

使用ADT 12,我做了以下操作:

1)使用Eclipse从SO文件中导出库。 确保你排除了AndroidManifest.xml。 这将包括源代码和其他数据,所以如果你正在分发,你会想要使用任何ZIP工具去掉这些不必要的位。

2)在您的应用程序的源代码树(我使用“lib”目录)中创build一个目录,并将您的库JAR复制到它。

3)在Eclipse中右键单击项目,然后select“configuration构buildpath”。 添加JAR并将其指向您的应用程序源代码树中的JAR。

4)在Eclipse首选项中,selectAndroid / Build部分,并取消选中“自动刷新生成资源和资产文件夹”。 您会注意到下面的选项“外部容器包含本地库时强制错误”。 有一个ADT的错误,这应该是在R17,它使用了错误的设置。 一旦修复,您将使用“强制错误”(确保未选中)。

5)一旦你build立你的应用APK,你将有一个libs / armeabi / libXXXX.so文件。 这不会在安装时自动解压缩。 您需要编写代码将其从APK文件中提取到您的数据目录中,然后在数据目录中的.so文件上使用System.load。

我有从dynamic加载的文件进行双向JNI调用,甚至使用dlopen()做我的自定义插件注册的东西。

将下面的行添加到android.mk

 include $(BUILD_PACKAGE) LOCAL_PREBUILT_STATIC_JAVA_LIBRARIES := alias:libs/your.jar include $(BUILD_MULTI_PREBUILT)