我在服务器上调用 别的同事 用c++写的so库,采用jna调用
Java 代码如下
import com.sun.jna.Library; import com.sun.jna.Native; public class TestSo { public interface LgetLib extends Library { LgetLib INSTANCE = (LgetLib) Native.loadLibrary("helloword", LgetLib.class); String print(); } public String print() { return LgetLib.INSTANCE.print(); } }
#include <stdio.h> #include <string> std::string print() { std::string res; res= "hello word"; return res; }
调用后老是报错
java.lang.UnsatisfiedLinkError: Error looking up function 'print': /usr/lib64/libhelloword.so: undefined symbol: print com.sun.jna.Function.<init>(Function.java:129) com.sun.jna.NativeLibrary.getFunction(NativeLibrary.java:250) com.sun.jna.Library$Handler.invoke(Library.java:191) com.sun.proxy.$Proxy41.print(Unknown Source) com.hshbic.aiTools.controller.device.TestSo.print(TestSo.java:15) com.hshbic.aiTools.controller.device.DeviceController.queryModuleTypes(DeviceController.java:25) sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) java.lang.reflect.Method.invoke(Method.java:606)
求解,是不是so库编译问题?
linux的so我不是很熟啊,但在windows上,dll是要声明export的,而且类型最好用char*<divclass='ref'>
我用C写的时候,是需要在头文件声明函数的,C++方面不太清楚,下面是我写的一个例子,希望能帮到您。<imgsrc="http://www.oschina.net/js/ke/plugins/emoticons/images/0.gif"alt="">
<atarget="_blank"rel="nofollow">https://blog-yaolin.rhcloud.com/blog/13.html
nmlibhelloworld.so|grepprint
C++的话,可能符号不是print,毕竟支持重载。
print前加extern"C"定义为C的链接方式,另外返回std::string要看jna对复杂类型的定义问题已解决C++代码问题
代码如下
<preclass="brush:cpp;toolbar:true;auto-links:false;">#include<jni.h>/ Headerforclasscom_hshbic_aiTools_util_JNIUtil/#include"helloword.h"#ifndef_Included_com_hshbic_aiTools_util_JNIUtil#define_Included_com_hshbic_aiTools_util_JNIUtil#ifdef__cplusplusextern"C"{#endif/ Class:com_hshbic_aiTools_util_JNIUtilMethod:testSignature:()I/JNIEXPORTjintJNICALLJava_com_hshbic_aiTools_util_JNIUtil_test(JNIEnv,jclass){return6;}JNIEXPORTjintJNICALLJava_com_hshbic_aiTools_util_JNIUtil_test1(JNIEnv*,jclass,jintst){returnst;}/**Class:com_hshbic_aiTools_util_JNIUtil Method:printSignature:(Ljava/lang/String;)Ljava/lang/String; /JNIEXPORTjstringJNICALLJava_com_hshbic_aiTools_util_JNIUtil_print(JNIEnvenv,jclassobj,jstringmsg){constchar*msg_str;msg_str=(*env).GetStringUTFChars(msg,false);jstringstring=(*env).NewStringUTF(msg_str);(*env).ReleaseStringUTFChars(msg,msg_str);returnstring;}版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。