2018-03-31
找不到jni导出的函数??
今天和开发伙伴做智能眼镜的对接。我需要把一个同事用c++写的tcp服务器编译为.so动态库并用java通过jni封装起来,给合作伙伴使用,总之给他们提供jar包和.so动态库...但因为是在智能眼镜里运行,而智能眼镜是android4.3,我在android studio里编译的jar包居然因为proguard版本不同,而无法调用。我一想,只有一个java文件,我就不编译了,直接给他,让他自己加入项目里,这总归没有编译格式不同的问题了把。结果是成功加载了.so库,但找不到导出的函数!但我用nm查看.so库,却是有的!@#¥@....什么情况??
后来想明白了,因为jni的接口格式是这样的:包名类名函数名,而在java类里是直接调用函数名,忽略包名和类名的。把调用.so库的java类直接放到项目中编译,因为包名变了,自然是找不到jni接口的(.so库的导出函数)
c++里调用GetMethodID时抛出NoSuchMethodError异常
在手机里运行,没有这个异常,而在眼镜里运行,却找不到java函数...又什么情况?弄了半天,后来才想到是不是因为眼镜的项目包含jar包后release编译,把在java层里没有调用到的函数优化掉了,因为这几个java函数是作为c++的回调函数,只在.so库里调用的。立马动手,在java里先调用了这几个函数后,果然可以在.so库里通过GetMethodID找到了!!