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

qyqx 发布于 2016/08/22 16:36
阅读 5K+
收藏 0

正在直播: LF AI 基金会主办首届AICON 2022>>>

 我在服务器上调用 别的同事 用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库编译问题?

加载中
0
张亦俊
张亦俊
linux的so我不是很熟啊,但在windows上,dll是要声明export的,而且类型最好用char*
0
qyqx
qyqx

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

linux的so我不是很熟啊,但在windows上,dll是要声明export的,而且类型最好用char*
java 的String 和C++哪个对应?
0
yaolin
yaolin

我用C写的时候,是需要在头文件声明函数的,C++方面不太清楚,下面是我写的一个例子,希望能帮到您。

https://blog-yaolin.rhcloud.com/blog/13.html

0
大梦1107
大梦1107

nm libhelloworld.so |grep print

C++的话,可能符号不是print,毕竟支持重载。

0
GestureWei
GestureWei
print前加extern "C"定义为C的链接方式,另外返回std::string要看jna对复杂类型的定义
0
xpbob
xpbob
jna不是很清楚,但是jni的话,返回java的string是需要用c++的字符串数组转化,例如 jstring jdata= env->NewStringUTF(data);data就是char数组
0
xpbob
xpbob
好像是必须加 extern "C"的
0
qyqx
qyqx

问题 已解决 C++代码问题 

代码如下

#include <jni.h>
/* Header for class com_hshbic_aiTools_util_JNIUtil */
#include "helloword.h"
#ifndef _Included_com_hshbic_aiTools_util_JNIUtil
#define _Included_com_hshbic_aiTools_util_JNIUtil
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     com_hshbic_aiTools_util_JNIUtil
 * Method:    test
 * Signature: ()I
 */
JNIEXPORT jint JNICALL Java_com_hshbic_aiTools_util_JNIUtil_test
  (JNIEnv *, jclass)
{
        return 6;
}
JNIEXPORT jint JNICALL Java_com_hshbic_aiTools_util_JNIUtil_test1
  (JNIEnv *, jclass, jint st){


    return st;

}
/*
 * Class:     com_hshbic_aiTools_util_JNIUtil
 * Method:    print
 * Signature: (Ljava/lang/String;)Ljava/lang/String;
 */
JNIEXPORT jstring JNICALL Java_com_hshbic_aiTools_util_JNIUtil_print
  (JNIEnv *env, jclass obj, jstring msg)
{
    const char *msg_str;
    msg_str = (*env).GetStringUTFChars(msg, false);
    jstring string = (*env).NewStringUTF(msg_str);
    (*env).ReleaseStringUTFChars(msg,msg_str);
    return string;
}



OSCHINA
登录后可查看更多优质内容
返回顶部
顶部