Java 链接/使用另一个中的.so文件

Java 链接/使用另一个中的.so文件,java,c++,java-native-interface,Java,C++,Java Native Interface,我有下面的getmacip.cpp文件和下面的snipp代码 // ...code #include "test.h" // ...code Test obj; obj.printDem(); // ...code 这是test.h文件 #ifndef TEST_H #define TEST_H class Test { public: void printDem(); }; #endif #include <iostream> usin

我有下面的
getmacip.cpp
文件和下面的snipp代码

// ...code

#include "test.h"

// ...code   

Test obj;
obj.printDem();

// ...code
这是
test.h
文件

#ifndef TEST_H
#define TEST_H
class Test
{
    public:
        void printDem();  
};
#endif
#include <iostream>
using namespace std;

void printDem()
{
    cout << "deus.ex.machina." << endl;
}
这是
test.cpp
文件

#ifndef TEST_H
#define TEST_H
class Test
{
    public:
        void printDem();  
};
#endif
#include <iostream>
using namespace std;

void printDem()
{
    cout << "deus.ex.machina." << endl;
}
这个很好用。但是,当我对test.cpp执行相同的操作并运行该程序时,会出现错误

/usr/lib/jvm/java-8-oracle/bin/java: symbol lookup error: /home/karl/workspace/sslarp/lib/libgetmacip.so: undefined symbol: _ZN4Test8printDemEv

我显然是链接错误的文件

printDem()的定义不属于类
Test

使用


<>也应该提到,原始JNI是一个简单的C接口,所有的本地调用都是以函数形式声明的,它们是C函数(它们的实现可以使用C++),也有一些项目可以帮助创建C++的AutoMa{G,t}的必需包装。

< P>定义<代码> PrimDeMe()不属于类
测试

使用


<>也应该提到,原始JNI是一个简单的C接口,所有的本地调用都是以函数形式声明的,它们是C函数(它们的实现可以使用C++),也有一些项目可以帮助创建C++的AutoMa{G,t}的必需包装。

< P>定义<代码> PrimDeMe()不属于类
测试

使用


<>也应该提到,原始JNI是一个简单的C接口,所有的本地调用都是以函数形式声明的,它们是C函数(它们的实现可以使用C++),也有一些项目可以帮助创建C++的AutoMa{G,t}的必需包装。

< P>定义<代码> PrimDeMe()不属于类
测试

使用


<>也应该提到,原始JNI是一个简单的C接口,所有的本地调用都是以C++函数执行的函数调用的(其实现可以使用C++,也有一些帮助创建C++AutoMac { G,t}的需要包装的项目)。 $nm-D libgetmacip.so

将生成符号列表

如果你必须删除C++名字,使用C++ FILT < /P> $nm-D libgetmacip.so | c++过滤器


查看“man nm”以了解符号的标记/使用方式

您可以查看此处的符号类型

$nm-D libgetmacip.so

将生成符号列表

如果你必须删除C++名字,使用C++ FILT < /P> $nm-D libgetmacip.so | c++过滤器


查看“man nm”以了解符号的标记/使用方式

您可以查看此处的符号类型

$nm-D libgetmacip.so

将生成符号列表

如果你必须删除C++名字,使用C++ FILT < /P> $nm-D libgetmacip.so | c++过滤器


查看“man nm”以了解符号的标记/使用方式

您可以查看此处的符号类型

$nm-D libgetmacip.so

将生成符号列表

如果你必须删除C++名字,使用C++ FILT < /P> $nm-D libgetmacip.so | c++过滤器


检查“手动nm”有关如何标记/使用符号的信息,请参见

将JNI教程更改为更全面的教程。好了,谢谢!问题是g++编译器命令,你的命令完成了,我想你必须将它们编译在一起才能正确链接。不,你不必。只需将库的所有部分链接在一起。例如,如果你有几个
.cpp
文件,您可以单独编译它们,但是您需要执行类似“g++-o test1.o test2.o”之类的操作……将JNI教程更改为更全面的教程。好了,谢谢!问题是g++编译器命令,您做到了,我想您必须将它们编译在一起才能正确链接它们。不,您不必。只需链接库的所有部分都放在一起。例如,如果你有几个
.cpp
文件,你可以分别编译它们,但是你需要做一些类似“g++-o test1.o test2.o”的事情……将JNI教程更改为一个更全面的教程。好了,谢谢!问题是g++编译器命令,你做到了,我想你必须这么做将它们编译在一起以正确地链接它们不,你不必。只需将库的所有部分链接在一起。例如,如果你有几个
.cpp
文件,你可以单独编译它们,但是你需要做一些类似“g++-o test1.o test2.o”的事情……将JNI教程更改为更全面的。好了,谢谢sue是g++编译器的命令,你做了这个把戏,我想你必须把它们编译在一起才能正确地链接起来。不,你不必。只要把库的所有部分链接在一起就行了。例如,如果你有几个
.cpp
文件,你可以分别编译它们,但是你需要做一些类似于'g++-o test1.o test2.o'的事情,我得到了下面是“U”这个符号是未定义的。我得到了下面的信息:“U”这个符号是未定义的。我得到了下面的信息:“U”这个符号是未定义的。我得到了下面的信息:“U”这个符号是未定义的。
g++ -fPIC -o libgetmacip.so \
    -shared -I $JAVA_HOME/include -I $JAVA_HOME/include/linux \
        detmacip.cpp test.cpp