最近发现以前使用百度地图sdk提供的坐标转换(GPS转百度坐标一直报错,错误如下)
java.lang.UnsatisfiedLinkError: No implementation found for boolean com.baidu.mapsdkplatform.comjni.tools.JNITools.CoordinateEncryptEx(float, float, java.lang.String, java.lang.Object) (tried Java_com_baidu_mapsdkplatform_comjni_tools_JNITools_CoordinateEncryptEx and Java_com_baidu_mapsdkplatform_comjni_tools_JNITools_CoordinateEncryptEx__FFLjava_lang_String_2Ljava_lang_Object_2)
at com.baidu.mapsdkplatform.comjni.tools.JNITools.CoordinateEncryptEx(Native Method)
at com.baidu.mapsdkplatform.comapi.util.b.a(Unknown Source)
at com.baidu.mapapi.model.CoordUtil.Coordinate_encryptEx(Unknown Source)
at com.baidu.mapapi.utils.CoordinateConverter.a(Unknown Source)
at com.baidu.mapapi.utils.CoordinateConverter.a(Unknown Source)
at com.baidu.mapapi.utils.CoordinateConverter.convert(Unknown Source)
根据错误可以知道,找不到CoordinateEncryptEx这个方法,so包没有导入成功。我本来是放在main/jniLibs文件下的,但是很明显没成功,然后尝试了放在libs下面,添加jniLibs.srcDirs = ['libs'],等等一系列网上搜索的方法,但是没什么用,依然找不到方法。
最后只有手动进行导入(既然自动导入不了,就只有手动了),可以在第一个activity中添加
static { System.loadLibrary("BaiduMapSDK_base_v5_3_0"); }
再次运行会发现找的到这个方法了,但是又报了其他的错误
JNI DETECTED ERROR IN APPLICATION: jmethodID was NULL
in call to CallVoidMethodV
这个错误一看就知道报在了so包里C/C++代码的,这可怎么办,调用方法如下所示,调用应该没有什么问题,也不知道是不是手动导入的问题,目前还不知道。
CoordinateConverter converter = new CoordinateConverter(); converter.from(CoordinateConverter.CoordType.GPS); converter.coord(new LatLng(34.69, 119.31)); LatLng desLatLng = converter.convert();
然后根据converter.convert()方法走进源代码,查看到调用so包方法的类为JNITools,这个类里定义了一些native修饰的方法(这些就是调用so里面的方法),可以找到如下方法
public static native double[] wgsToBaidu(double var0, double var2);
这个方法一看方法名,就是将wgs坐标转为百度坐标,wgs84(是为GPS全球定位系统使用而建立的坐标系统)。
于是直接使用wgsToBaidu方法来实现转换。
double[] bd = JNITools.wgsToBaidu(34.69, 119.31);
这样就实现了GPS坐标转换为百度坐标的功能。