2017-08-03 166 views
0

我有一个名为libmbc.so的开源共享库。我有兴趣在java实现中使用这个库,它应该能够重现已经在C++中测试过的行为。理想情况下,我的目标是访问此库中名为MBCNodal的类,并在java包装器中调用其成员函数。 如果我解开共享库与nm -gC libmbc.so内容,我得到如下jna包装共享.so库 - 访问类

    U [email protected]@GLIBC_2.2.5 
       U [email protected]@GLIBC_2.2.5 
000000000020e278 B __bss_start 
       U [email protected]@GLIBC_2.2.5 
       U [email protected]@GLIBC_2.2.5 
       w [email protected]@GLIBC_2.2.5 
       U [email protected]@CXXABI_1.3 
       U [email protected]@CXXABI_1.3 
000000000020e278 D _edata 
000000000020e280 B _end 
       U [email protected]@GLIBC_2.2.5 
0000000000009ab0 T _fini 
       U [email protected]@GLIBC_2.2.5 
       U [email protected]@GLIBC_2.2.5 
       U [email protected]@GLIBC_2.2.5 
       U [email protected]@GLIBC_2.2.5 
       U [email protected]@GLIBC_2.2.5 
       w __gmon_start__ 
       U [email protected]@CXXABI_1.3 
0000000000003db8 T _init 
       w _ITM_deregisterTMCloneTable 
       w _ITM_registerTMCloneTable 
       w _Jv_RegisterClasses 
       U [email protected]@GLIBC_2.2.5 
0000000000004670 T mbc_check_cmd 
000000000020e27c B mbc_dummy 
00000000000046c0 T mbc_get_cmd 
0000000000004850 T mbc_inet_init 
0000000000005f60 T mbc_modal_destroy 
0000000000005690 T mbc_modal_get_motion 
0000000000005a40 T mbc_modal_init 
0000000000005b90 T mbc_modal_negotiate_request 
0000000000005db0 T mbc_modal_negotiate_response 
00000000000058d0 T mbc_modal_put_forces 
00000000000055d0 T mbc_nodal_destroy 
0000000000004970 T mbc_nodal_get_motion 
0000000000004c30 T mbc_nodal_init 
00000000000051d0 T mbc_nodal_negotiate_request 
00000000000053f0 T mbc_nodal_negotiate_response 
0000000000004b30 T mbc_nodal_put_forces 
0000000000004720 T mbc_put_cmd 
00000000000048f0 T mbc_unix_init 
00000000000097a0 T mbdyn_host2inet_addr 
0000000000009980 T mbdyn_make_inet_socket 
0000000000009890 T mbdyn_make_inet_socket_type 
0000000000009aa0 T mbdyn_make_named_socket 
00000000000099a0 T mbdyn_make_named_socket_type 
       U [email protected]@GLIBC_2.2.5 
       U [email protected]@GLIBC_2.2.5 
       U [email protected]@GLIBC_2.2.5 
       U [email protected]@GLIBC_2.2.5 
       U [email protected]@GLIBC_2.2.5 
       U [email protected]@GLIBC_2.2.5 
       U [email protected]@GLIBC_2.2.5 
       U [email protected]@GLIBC_2.2.5 
       U [email protected]@GLIBC_2.2.5 
       U [email protected]@GCC_3.0 
       U [email protected]@GLIBC_2.2.5 
       U operator delete(void*, unsigned long)@@CXXABI_1.3.9 
0000000000006000 T MBCBase::SetTimeout(int) 
0000000000006010 T MBCBase::SetVerbose(bool) 
0000000000007710 T MBCBase::DynamicsLabel() 
0000000000006020 T MBCBase::SetDataAndNext(bool) 
0000000000007a20 T MBCBase::F(unsigned char) 
0000000000007bf0 T MBCBase::M(unsigned char) 
00000000000064b0 T MBCBase::Init(char const*) 
0000000000006510 T MBCBase::Init(char const*, unsigned short) 
00000000000062b0 T MBCBase::SetStatus(MBCBase::Status) 
00000000000063e0 T MBCBase::MBCBase() 
00000000000063e0 T MBCBase::MBCBase() 
0000000000006490 T MBCBase::~MBCBase() 
0000000000006400 T MBCBase::~MBCBase() 
0000000000006400 T MBCBase::~MBCBase() 
0000000000009310 T MBCModal::Initialize(MBCBase::Rot, unsigned int) 
0000000000009490 T MBCModal::DynamicsLabel() 
00000000000094b0 T MBCModal::F(unsigned char) 
00000000000094d0 T MBCModal::M(unsigned char) 
0000000000009730 T MBCModal::P(unsigned int) 
00000000000093a0 T MBCModal::MBCModal(MBCBase::Rot, unsigned int) 
00000000000092c0 T MBCModal::MBCModal() 
00000000000093a0 T MBCModal::MBCModal(MBCBase::Rot, unsigned int) 
00000000000092c0 T MBCModal::MBCModal() 
0000000000006470 T MBCModal::~MBCModal() 
0000000000006450 T MBCModal::~MBCModal() 
0000000000006450 T MBCModal::~MBCModal() 
0000000000007d40 T MBCNodal::Initialize(MBCBase::Rot, unsigned int, bool, MBCBase::Rot, bool) 
0000000000008e60 T MBCNodal::DynamicsLabel(unsigned int) 
0000000000007f20 T MBCNodal::DynamicsLabel() 
0000000000007f40 T MBCNodal::F(unsigned char) 
0000000000009110 T MBCNodal::F(unsigned int, unsigned char) 
0000000000007f60 T MBCNodal::M(unsigned char) 
0000000000009220 T MBCNodal::M(unsigned int, unsigned char) 
0000000000007e00 T MBCNodal::MBCNodal(MBCBase::Rot, unsigned int, bool, MBCBase::Rot, bool) 
0000000000007cf0 T MBCNodal::MBCNodal() 
0000000000007e00 T MBCNodal::MBCNodal(MBCBase::Rot, unsigned int, bool, MBCBase::Rot, bool) 
0000000000007cf0 T MBCNodal::MBCNodal() 
0000000000006430 T MBCNodal::~MBCNodal() 
0000000000006410 T MBCNodal::~MBCNodal() 
0000000000006410 T MBCNodal::~MBCNodal() 
00000000000077c0 T MBCBase::GetRefNodeF() const 
0000000000007870 T MBCBase::GetRefNodeM() const 
0000000000006780 T MBCBase::GetRefNodeR() const 
00000000000066d0 T MBCBase::GetRefNodeX() const 
0000000000006050 T MBCBase::bDataAndNext() const 
0000000000006a20 T MBCBase::GetRefNodeXP() const 
0000000000007660 T MBCBase::DynamicsLabel() const 
0000000000006100 T MBCBase::GetRefNodeRot() const 
0000000000006bb0 T MBCBase::GetRefNodeXPP() const 
0000000000006150 T MBCBase::bAccelerations() const 
0000000000006ad0 T MBCBase::GetRefNodeOmega() const 
0000000000006860 T MBCBase::GetRefNodeTheta() const 
0000000000006620 T MBCBase::KinematicsLabel() const 
0000000000006c90 T MBCBase::GetRefNodeOmegaP() const 
0000000000006940 T MBCBase::GetRefNodeEuler123() const 
0000000000007950 T MBCBase::F(unsigned char) const 
0000000000007af0 T MBCBase::M(unsigned char) const 
0000000000006e60 T MBCBase::R(unsigned char, unsigned char) const 
0000000000006d90 T MBCBase::X(unsigned char) const 
00000000000075b0 T MBCBase::GetRefNodeDynamicsLabel() const 
00000000000065a0 T MBCBase::GetRefNodeKinematicsLabel() const 
00000000000071b0 T MBCBase::XP(unsigned char) const 
0000000000007380 T MBCBase::XPP(unsigned char) const 
0000000000007280 T MBCBase::Omega(unsigned char) const 
0000000000006fb0 T MBCBase::Theta(unsigned char) const 
0000000000006580 T MBCBase::GetCmd() const 
0000000000006080 T MBCBase::GetRot() const 
0000000000007480 T MBCBase::OmegaP(unsigned char) const 
0000000000006190 T MBCBase::bLabels() const 
00000000000060c0 T MBCBase::bRefNode() const 
0000000000006030 T MBCBase::bVerbose() const 
00000000000070b0 T MBCBase::Euler123(unsigned char) const 
0000000000006070 T MBCBase::GetStatus() const 
0000000000005fd0 T MBCModal::GetBasePtr() const 
0000000000009480 T MBCModal::DynamicsLabel() const 
0000000000005fe0 T MBCModal::GetRefNodePtr() const 
00000000000093f0 T MBCModal::KinematicsLabel() const 
00000000000094a0 T MBCModal::F(unsigned char) const 
00000000000094c0 T MBCModal::M(unsigned char) const 
00000000000096c0 T MBCModal::P(unsigned int) const 
00000000000095a0 T MBCModal::Q(unsigned int) const 
0000000000009410 T MBCModal::R(unsigned char, unsigned char) const 
0000000000009400 T MBCModal::X(unsigned char) const 
0000000000009600 T MBCModal::QP(unsigned int) const 
0000000000009440 T MBCModal::XP(unsigned char) const 
0000000000009460 T MBCModal::XPP(unsigned char) const 
0000000000009670 T MBCModal::GetP() const 
0000000000009520 T MBCModal::GetQ() const 
00000000000063a0 T MBCModal::Close() const 
0000000000009560 T MBCModal::GetQP() const 
0000000000009450 T MBCModal::Omega(unsigned char) const 
0000000000009420 T MBCModal::Theta(unsigned char) const 
0000000000009470 T MBCModal::OmegaP(unsigned char) const 
0000000000005ff0 T MBCModal::GetType() const 
0000000000009430 T MBCModal::Euler123(unsigned char) const 
00000000000094e0 T MBCModal::GetModes() const 
0000000000006280 T MBCModal::GetMotion() const 
0000000000006350 T MBCModal::Negotiate() const 
0000000000006240 T MBCModal::PutForces(bool) const 
0000000000005fa0 T MBCNodal::GetBasePtr() const 
0000000000008af0 T MBCNodal::GetEuler123(unsigned int) const 
0000000000008140 T MBCNodal::GetEuler123() const 
0000000000008dd0 T MBCNodal::DynamicsLabel(unsigned int) const 
0000000000007f10 T MBCNodal::DynamicsLabel() const 
0000000000005fb0 T MBCNodal::GetRefNodePtr() const 
0000000000008910 T MBCNodal::KinematicsLabel(unsigned int) const 
0000000000007e80 T MBCNodal::KinematicsLabel() const 
0000000000008d60 T MBCNodal::GetDynamicsLabel() const 
0000000000008880 T MBCNodal::GetKinematicsLabel(unsigned int) const 
0000000000007fb0 T MBCNodal::GetKinematicsLabel() const 
0000000000007f30 T MBCNodal::F(unsigned char) const 
00000000000090a0 T MBCNodal::F(unsigned int, unsigned char) const 
0000000000007f50 T MBCNodal::M(unsigned char) const 
0000000000009180 T MBCNodal::M(unsigned int, unsigned char) const 
0000000000007ea0 T MBCNodal::R(unsigned char, unsigned char) const 
00000000000083d0 T MBCNodal::R(unsigned int, unsigned char, unsigned char) const 
0000000000007e90 T MBCNodal::X(unsigned char) const 
0000000000008360 T MBCNodal::X(unsigned int, unsigned char) const 
0000000000007ed0 T MBCNodal::XP(unsigned char) const 
0000000000008600 T MBCNodal::XP(unsigned int, unsigned char) const 
0000000000007ef0 T MBCNodal::XPP(unsigned char) const 
0000000000008710 T MBCNodal::XPP(unsigned int, unsigned char) const 
0000000000008fa0 T MBCNodal::GetF(unsigned int) const 
0000000000008ef0 T MBCNodal::GetF() const 
0000000000009010 T MBCNodal::GetM(unsigned int) const 
0000000000008f30 T MBCNodal::GetM() const 
00000000000089f0 T MBCNodal::GetR(unsigned int) const 
0000000000008060 T MBCNodal::GetR() const 
00000000000089a0 T MBCNodal::GetX(unsigned int) const 
0000000000008020 T MBCNodal::GetX() const 
0000000000006310 T MBCNodal::Close() const 
0000000000008b70 T MBCNodal::GetXP(unsigned int) const 
00000000000081b0 T MBCNodal::GetXP() const 
0000000000007ee0 T MBCNodal::Omega(unsigned char) const 
0000000000008670 T MBCNodal::Omega(unsigned int, unsigned char) const 
0000000000007eb0 T MBCNodal::Theta(unsigned char) const 
00000000000084a0 T MBCNodal::Theta(unsigned int, unsigned char) const 
0000000000008c40 T MBCNodal::GetXPP(unsigned int) const 
0000000000008260 T MBCNodal::GetXPP() const 
0000000000007f00 T MBCNodal::OmegaP(unsigned char) const 
00000000000087b0 T MBCNodal::OmegaP(unsigned int, unsigned char) const 
0000000000005fc0 T MBCNodal::GetType() const 
0000000000007ec0 T MBCNodal::Euler123(unsigned char) const 
0000000000008550 T MBCNodal::Euler123(unsigned int, unsigned char) const 
0000000000007f70 T MBCNodal::GetNodes() const 
0000000000008bc0 T MBCNodal::GetOmega(unsigned int) const 
00000000000081f0 T MBCNodal::GetOmega() const 
0000000000008a70 T MBCNodal::GetTheta(unsigned int) const 
00000000000080d0 T MBCNodal::GetTheta() const 
0000000000006210 T MBCNodal::GetMotion() const 
0000000000008cc0 T MBCNodal::GetOmegaP(unsigned int) const 
00000000000082d0 T MBCNodal::GetOmegaP() const 
00000000000062c0 T MBCNodal::Negotiate() const 
00000000000061d0 T MBCNodal::PutForces(bool) const 
000000000020dc48 V typeinfo for MBCBase 
000000000020dc70 V typeinfo for MBCModal 
000000000020dc58 V typeinfo for MBCNodal 
000000000000b468 V typeinfo name for MBCBase 
000000000000b488 V typeinfo name for MBCModal 
000000000000b478 V typeinfo name for MBCNodal 
000000000020dc88 V vtable for MBCBase 
000000000020dd38 V vtable for MBCModal 
000000000020dce0 V vtable for MBCNodal 
       U vtable for __cxxabiv1::[email protected]@CXXABI_1.3 
       U vtable for __cxxabiv1::[email protected]@CXXABI_1.3 

所以我的感觉是,MBCNodal类是与JNA莫名其妙地访问。但我无法弄清楚如何?

我不希望修改库实现。我有.h和.cpp的源代码。但我不知道它是如何编译的,以便生成libmbc.so。

感谢您的帮助。

编辑

这里是我如何加载库和访问的extern方法示例代码:

private interface Wrapper extends Library { 

     Wrapper INSTANCE = Native.loadLibrary(C_LIBRARY_PATH, Wrapper.class); 

     Pointer mbc_nodal_init(Pointer ptr, int refnode, int nodes, int label, int rot, int accels); 

     int mbc_nodal_get_motion(Pointer ptr); 

     int mbc_nodal_negotiate_request(Pointer ptr); 

     int mbc_nodal_put_forces(Pointer ptr, int converged); 


    } 

回答

0

您可以使用JNI作为一个适配器。

看看这两个样品。我想,这是你正在寻找的东西。

http://jnicookbook.owsiak.org/recipe-No-021/

http://jnicookbook.owsiak.org/recipe-No-023/

在这两种情况下,你将被JNI代码来实现

enter image description here

当然,你必须确保正确映射Java数据代码到你基于.so的函数所需要的东西。

对于JNA,有相当全面的教程网站在这里:

http://www.eshayne.com/jnaex/index.html

+0

我的问题是不是访问库中的方法,如在编辑中所示,这是理解的。但我的困难是访问类MBCNodal及其成员函数。我宁愿不必使用JNI。 – Yvus

+0

也许这一个会帮助你:https://github.com/mkowsiak/jnicookbook/tree/master/recipeNo025 – mko

+0

是的,我想访问java中的Simple类,但不幸的是,java实现没有提及任何这个班? – Yvus