android ndk如何调用第三方so库文件?
已知条件:SO库是一个Android版本连接库(*。so文件)并提供了详细的接口描述;
了解解决方案:
1.将SO文件直接放在libs/armeabi下,然后是system。代码中的LoadLibrary(" XXX ");然后public native static int XXX _ XXX _ XXX();然后可以直接调用xxx_xxx_xxx()方法;
2.第二种方案是创建自己的SO文件,在自己的SO文件中调用第三方SO,然后在程序中调用自己的SO。这很复杂,您需要构建一个java类文件,生成一个。h文件中,写入。h文件之前生成的C源文件是include,并实现相应的方法。最后,使用android NDK开发包中的ndk-build脚本来生成相应的。所以* *共享库;
求解:
1.以上两种方案可行吗?不可行会有什么问题?
2.这两个方案有什么区别?为什么网上大多数人都用第二种方案?
3.只有一个*。so文件,并提供了详细的接口描述。可以用在安卓上吗?
首先,它取决于这个SO是否是一个JNI标准SO,比如它是否返回一个JNI不直接支持的类型。也就是说,这能直接称为JNI吗?如果答案是否定的,你只能选择第二个方案。
如果答案是肯定的,那就要看你是否希望这个SO库直接暴露给JAVA层了。如果答案是否定的,你只能选择第二种方案,比如你也是一个库提供者。
一般如果你只有SO,说明是别人提供给你的,你可以要求对方给你提供匹配的JAVA调用文件。
1,这要看这样是否符合JNI呼叫的规范。看你自己的意愿了。
2.因为第二种方法最灵活,各种情况都可以实现。
3.是的。
看能不能直接从JAVA调用最简单的方法就是看SO中的函数名是否是Java_XXX_XXX_XXX格式。
是的,你可以。可以自己写一个匹配的JAVA文件,注意SO函数名和JAVA函数名的转换规则,或者向SO提供者索取。
如果没有,选择第二个方案。
1,检查所需证件是否齐全。
要使用第三方动态库,至少要有两个文件,一个是动态库(。所以),另一个文件包含。
头文件(。h)由动态库API声明
2.封装原始动态库
原来的动态库文件不包含jni接口需要的信息,所以我们需要封装它,所以我
我们的需求是将libadd.so中的API封装成一个带有jni接口的动态。
3.写库的封装函数libaddjni.c。
根据前面生成的com _ Android _ libjni _ libjavaheader . h文件,编写libaddjni.c并使用。
生成libaddjni.so
集成第三方软件包(。罐子,。所以)在安卓。
Android中可能会使用第三方软件包,包括Java包。jar和本地包。所以。Jar包可以通过Eclipse开发环境或编译的源代码集成,这取决于您的工作环境。
假设我自己的程序是MyMaps,我需要使用BaiduMaps库,包括baidumapapi.jar和libbmapappingine _ v 1 _ 3 _ 1 . so。
首先,集成第三方jar包和。所以Eclipse中的动态库。
在MyMaps项目下创建目录libs和libs/armeabi,将baidumapapi.jar放在libs/目录下,将libbmapappingine _ v 1 _ 3 _ 1 . so放在libs/armeabi/下
在Eclipse中将第三方jar包baidumapapi.jar打包到MyMaps中的步骤:
1.右键单击该项目,然后选择“属性”;;
2.Java构建路径,选择库;;
3.在库页面上单击右键“添加库…”;
4.选择“用户库”,点击“下一步”;
5.单击“用户库”按钮;
6.在弹出的界面中,点击“新建…”;
7.输入“用户库名”,点击“确定”确认;
8.返回后,选择新创建的用户库,点击右边的“添加Jars”;
9.选择baidumapapi.jar在MyMaps/libs/下;
10.确认后返回。
这样编译后jar包会被打成MyMaps.apk,libbmapappingine _ v 1 _ 3 _ 1 . so也会被打包成lib/armeabi/
程序运行过程中,libbmapapigine _ v 1 _ 3 _ 1 . so放在/data/data/中
第二,集成第三方集成jar包和。所以源代码中的动态库。
Android源代码中的MyMaps放在packages/apps下。在MyMaps下创建目录libs和libs/armeabi,将baidumapapi.jar放在libs/中,将libbmapapigine _ v 1 _ 3 _ 1 . so放在libs/armeabi中。
2.1修改Android.mk文件
Android.mk文件如下:
[普通]查看普通副本
LOCAL_PATH:= $(调用my-dir)
包括美元(VARS结算)
本地模块标签:=可选
LOCAL _ STATIC _ JAVA _ LIBRARIES:= libbaidumapapi
LOCAL_SRC_FILES := $(调用all-subdir-java-files)
LOCAL_PACKAGE_NAME :=我的地图
包含$(BUILD_PACKAGE)
##################################################
包括美元(VARS结算)
LOCAL _ pre build _ STATIC _ JAVA _ LIBRARIES:= libbaidumappi:libs/baidumappi . jar
LOCAL _ pre build _ LIBS:= libBMapApiEngine _ v 1 _ 3 _ 1:libs/armea bi/libBMapApiEngine _ v 1 _ 3 _ 1 . so
本地模块标签:=可选
包含$(BUILD _ MULTI _ prebuild)
#使用以下include制作我们的测试包。
包含$(callall-makefiles-under,$(LOCAL_PATH))
1集成jar包
LOCAL_STATIC_JAVA_LIBRARIES取jar库的别名,可以取任意值;
local _ pre build _ static _ Java _ libraries指定prebuiltjar库的规则,格式:别名:jar文件路径。注意:别名必须与LOCAL_STATIC_JAVA_LIBRARIES中的别名相同,并且不包含。罐子;;jar文件的路径必须是存储第三方jar包的真实路径。
BUILD _ MULTI _ PREBUILT用于编译。
2集成。所以动态库
LOCAL _ pre build _ LIBS指定预建so的规则,格式:别名:so文件路径。注意:别名通常不能更改,尤其是当第三方jar包使用。所以库并不包含。所以;so文件的路径必须是存储第三方so文件的真实路径。
BUILD _ MULTI _ PREBUILT用于编译和复制。
2.2加入不受影响的用户模块
在user_tags.mk文件中,将libbmapapigine _ v 1 _ 3 _ 1添加到GRANDFATHERED_USER_MODULES中。
[普通]查看普通副本
grand granted _ USER _ MODULES+= \
… \
libBMapApiEngine _ v 1 _ 3 _ 1
User_tags.mk可以在build/core或$(TARGET_DEVICE_DIR)下。建议修改$(目标设备目录)。
2.3编译结果
MyMaps.apk在out/target/product/中编译生成
libbmapapigine _ v 1 _ 3 _ 1 . so in out/目标/产品/