最近在做一个NDK的Android项目,需要将cpp代码打包生成so库。
为了方便,直接将之前的一个项目拿过来,将cpp代码拷贝进来,修改了Android.mk文件,ndk-build成功生成so库。
兴奋~~~
小样,不要高兴太早,在下面等着你呢。。。
一调用native方法就报错:
java.lang.UnsatisfiedLinkError: No implementation found for int com.xxx.utils.RtcmUtil.decode(byte[], int) (tried Java_com_xxx_utils_RtcmUtil_decode and Java_com_xxx_utils_RtcmUtil_decode___3BI)at com.xxx.utils.RtcmUtil.decode(Native Method)at com..ntrip.NtripClient$2.run(NtripClient.java:177)
于是,我一点点检查,包名、方法名,一个字母、一个字母的核对。
没有错啊,为什么?为什么?为什么?
苦思不得其解,只能一点点摸索,尝试。。。
在java类中从新写一个native方法,用 javah -classpath . -jni com.xxx.utils.RtcmUtil 命令从新生成头文件,在cpp代码中从新实现这个新的方法,调用改方法,成功了,居然成功啦。
对比一下两个有什么不同,发现两个函数的参数类型不同,
有问题的参数:add(JNIEnv *env, jobject obj, jstring s)
没问题的参数:add(JNIEnv *env, jclass obj, jstring s)
我就奇怪了,为什么之前的项目,我用的就是add(JNIEnv *env, jobject obj, jstring s)
为什么可以调用,不会报错呢?
有哪位大神知道是什么原因,欢迎分享讨论。