开发者社区> 问答> 正文

Linux用jna 调用so动态库 报错 Error looking up fu?报错

 我在服务器上调用 别的同事 用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();
	}

}



c++源码

#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库编译问题?

展开
收起
爱吃鱼的程序员 2020-06-09 11:19:14 1366 0
1 条回答
写回答
取消 提交回答
  • https://developer.aliyun.com/profile/5yerqm5bn5yqg?spm=a2c6h.12873639.0.0.6eae304abcjaIB

    linux的so我不是很熟啊,但在windows上,dll是要声明export的,而且类型最好用char*<divclass='ref'>

    引用来自“张亦俊”的评论

    linux的so我不是很熟啊,但在windows上,dll是要声明export的,而且类型最好用char*

    我用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对复杂类型的定义
    jna不是很清楚,但是jni的话,返回java的string是需要用c++的字符串数组转化,例如<spanstyle="color:#777777;font-family:monospace;font-size:13px;line-height:18.2px;background-color:#FDF6E3;">jstring jdata= env->NewStringUTF(data);data就是char数组好像是必须加<spanstyle="font-family:幼圆,Verdana,sans-serif,宋体;font-size:14px;line-height:normal;background-color:#FFFFFF;">extern"C"的

    问题已解决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;}



    2020-06-09 11:19:31
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
Alibaba Cloud Linux 3 发布 立即下载
ECS系统指南之Linux系统诊断 立即下载
ECS运维指南 之 Linux系统诊断 立即下载