Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/144.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
未定义的符号:Linux中的JNI_CreateJavaVM_Java_C++_Linux_Java Native Interface_Shared Libraries - Fatal编程技术网

未定义的符号:Linux中的JNI_CreateJavaVM

未定义的符号:Linux中的JNI_CreateJavaVM,java,c++,linux,java-native-interface,shared-libraries,Java,C++,Linux,Java Native Interface,Shared Libraries,我有两个项目。两者都是在64位Ubuntu上的Netbeans IDE中创建的 首先,My.Project从C++代码实现调用java函数。 我的控制台应用程序尝试调用.so文件中的函数 编译并运行时,我遇到如下错误: /home/online0227/desktop/jvm run/dist/Debug/GNU-Linux-x86/jvm_run: symbol lookup error: ./libjvm_dll.so: undefined symbol: JNI_CreateJavaVM

我有两个项目。两者都是在64位Ubuntu上的Netbeans IDE中创建的

首先,My.Project从C++代码实现调用java函数。 我的控制台应用程序尝试调用.so文件中的函数

编译并运行时,我遇到如下错误:

/home/online0227/desktop/jvm run/dist/Debug/GNU-Linux-x86/jvm_run: symbol lookup error: ./libjvm_dll.so: undefined symbol: JNI_CreateJavaVM
如何解决这个问题

我包含了我的.so项目的include路径。以下是我编译时netbeans在其构建输出上显示的内容。因此,project:

g++    -c -g -I/home/online0227/jdk1.7.0_25_x64/include/linux -I/home/online0227/jdk1.7.0_25_x64/include -fPIC  -MMD -MP -MF build/Debug/GNU-Linux-x86/_ext/1117207477/testlib.o.d -o build/Debug/GNU-Linux-x86/_ext/1117207477/testlib.o /home/online0227/desktop/jvm\ dll/testlib.cpp

g++     -o dist/Debug/GNU-Linux-x86/libjvm_dll.so build/Debug/GNU-Linux-x86/_ext/1117207477/testlib.o  -shared -fPIC
这个.so编译得非常好,并生成.so文件

下面是我的Netbeans在编译主控制台应用程序时显示的内容:

g++    -c -g -I/home/online0227/jdk1.7.0_25_x64/include/linux -I/home/online0227/jdk1.7.0_25_x64/include -MMD -MP -MF build/Debug/GNU-Linux-x86/main.o.d -o build/Debug/GNU-Linux-x86/main.o main.cpp

g++     -o dist/Debug/GNU-Linux-x86/jvm_run build/Debug/GNU-Linux-x86/main.o -L/home/online0227/jdk1.7.0_25_x64/jre/lib/amd64/server -ldl -ljvm
它也能很好地编译和运行

但问题是,当我尝试创建Java虚拟机、JNI_CreateJavaVM&jvm、reinterpret_cast&env和vm_参数时,会收到一条错误消息

下面是我所有的源代码

对于.so项目的testLib.h:

对于.so项目的testVir.h:

对于.so项目的testLib.cpp:

最后,这里是我的主控制台应用程序main.cpp:


您的libjvm_dll.so使用libjvm.so中的符号,因此在构建libjvm时,它应该与libjvm_dll.so链接

g++     -o dist/Debug/GNU-Linux-x86/libjvm_dll.so build/Debug/GNU-Linux-x86/_ext/1117207477/testlib.o  -shared -fPIC \
-L/home/online0227/jdk1.7.0_25_x64/jre/lib/amd64/server -ljvm
整个构建过程:

# Build libjvm_dll.so
g++ -o libjvm_dll.so -I $JAVA_HOME/include testLib.cpp -shared -fPIC -L $JAVA_HOME/jre/lib/amd64/server -ljvm
# Build main executable 
g++ -o jvm_run main.cpp -ldl
# Run
LD_LIBRARY_PATH=$JAVA_HOME/jre/lib/amd64/server ./jvm_run

您的libjvm_dll.so使用libjvm.so中的符号,因此在构建libjvm时,它应该与libjvm_dll.so链接

g++     -o dist/Debug/GNU-Linux-x86/libjvm_dll.so build/Debug/GNU-Linux-x86/_ext/1117207477/testlib.o  -shared -fPIC \
-L/home/online0227/jdk1.7.0_25_x64/jre/lib/amd64/server -ljvm
整个构建过程:

# Build libjvm_dll.so
g++ -o libjvm_dll.so -I $JAVA_HOME/include testLib.cpp -shared -fPIC -L $JAVA_HOME/jre/lib/amd64/server -ljvm
# Build main executable 
g++ -o jvm_run main.cpp -ldl
# Run
LD_LIBRARY_PATH=$JAVA_HOME/jre/lib/amd64/server ./jvm_run

请尝试查看此网站的博客


请尝试查看此网站的博客


如果在创建.so时执行此操作,则主控制台应用程序的dlopen无法加载此.so文件。dlopen不返回任何内容,因此我的void*句柄没有收到地址,一直指向0x0内存。它表示libjvm.so:无法打开共享对象文件:没有这样的文件或目录,无论我是否将-L/home/online0227/jdk1.7.0_25_x64/jre/lib/amd64/server-ljvm放入控制台主应用程序。在这两种情况下都会显示错误消息。运行时是否设置了LD_LIBRARY_PATH?我对Linux非常陌生,但我想我设置了。以下是我在terminal=>echo$LD_LIBRARY_PATH/home/online0227/jdk1.7.0_25_x64/jre/lib/amd64:/home/online0227/jdk1.7.0_25_x64/jre/lib/amd64/serverlibjvm中键入echo$LD_LIBRARY\u PATH得到的结果​jre/lib/amd64/server,这样应该可以工作。您是否已将LD_LIBRARY_PATH设置为具有导出LD_LIBRARY_PATH的环境变量?如果在创建.so时执行此操作,则主控制台应用程序的dlopen无法加载此.so文件。dlopen不返回任何内容,因此我的void*句柄没有收到地址,一直指向0x0内存。它表示libjvm.so:无法打开共享对象文件:没有这样的文件或目录,无论我是否将-L/home/online0227/jdk1.7.0_25_x64/jre/lib/amd64/server-ljvm放入控制台主应用程序。在这两种情况下都会显示错误消息。运行时是否设置了LD_LIBRARY_PATH?我对Linux非常陌生,但我想我设置了。以下是我在terminal=>echo$LD_LIBRARY_PATH/home/online0227/jdk1.7.0_25_x64/jre/lib/amd64:/home/online0227/jdk1.7.0_25_x64/jre/lib/amd64/serverlibjvm中键入echo$LD_LIBRARY\u PATH得到的结果​jre/lib/amd64/server,这样应该可以工作。您是否已使用导出LD_LIBRARY_PATH将LD_LIBRARY_PATH设置为环境变量?
g++     -o dist/Debug/GNU-Linux-x86/libjvm_dll.so build/Debug/GNU-Linux-x86/_ext/1117207477/testlib.o  -shared -fPIC \
-L/home/online0227/jdk1.7.0_25_x64/jre/lib/amd64/server -ljvm
# Build libjvm_dll.so
g++ -o libjvm_dll.so -I $JAVA_HOME/include testLib.cpp -shared -fPIC -L $JAVA_HOME/jre/lib/amd64/server -ljvm
# Build main executable 
g++ -o jvm_run main.cpp -ldl
# Run
LD_LIBRARY_PATH=$JAVA_HOME/jre/lib/amd64/server ./jvm_run