gpt4 book ai didi

java - JNI - 创建另一个 C++ 类的实例

转载 作者:太空宇宙 更新时间:2023-11-04 13:41:45 24 4
gpt4 key购买 nike

我有一个旧应用程序 (C++),我想通过 JNI 用 java 调用它。所以我阅读了一些教程和基础知识(从 Java 调用 C++ 中的方法)效果很好。

但现在我的问题是我想在方法中实例化另一个 C++ 对象,它由 JNI 使用。这在原则上是不可能的还是有什么办法可以做到这一点?

解释:

这是我的 Java 类 helloworld.java,它调用 native 方法“callnative()”

public class helloworld{
private native void callnative();

public static void main(String[] args){
new helloworld().callnative();

}

static {
System.loadLibrary("helloworld");
}
}

这是本地方法 java_helloworld_callnative(..)

#include <jni.h>
#include <stdio.h>
#include "helloworld.h"
#include "hellouniverse.h"

JNIEXPORT void JNICALL Java_helloworld_callnative(JNIEnv *env,
jobject obj)
{
printf("HelloWorld\n");
hellouniverse *h = new hellouniverse();
h->printHelloUniverse();
return;
}

这是类 hellouniverse

#include "hellouniverse.h"
#include <stdio.h>
#include <string>

using namespace std;

hellouniverse::hellouniverse(){
}

void hellouniverse::printHelloUniverse(){
printf("HelloUniverse!!\n");
}

我用以下代码编译了 helloworld.cpp:

g++ -fPIC -shared -I$JAVA_PATH/include -I$JAVA_PATH/include/linux/-o libhelloworld.so hellworld.cpp

和 hellouniverse.cpp 有:

g++ -c -o hellouniverse.o hellouniverse.cpp

当我运行 java helloworld 时,输出是:

Hello World java:符号查找错误:$./libhelloworld.so: undefined symbol :_ZN13hellouniverseC1Ev

我希望你能帮我解决我的问题:-)

最佳答案

您必须将 hellouniverse 内容链接到库中。例如

g++ -fPIC -shared -I$JAVA_PATH/include -I$JAVA_PATH/include/linux/ -o libhelloworld.so hellworld.cpp hellouniverse.cpp

或者

g++ -fPIC -I $JAVA_PATH/include -I$JAVA_PATH/include/linux -c helloworld.cpp
g++ -fPIC -I $JAVA_PATH/include -I$JAVA_PATH/include/linux -c hellouniverse.cpp
g++ -fPIC -shared -o libhelloworld.so helloworld.o hellouniverse.o

考虑使用 Makefile 来自动执行此操作。

关于java - JNI - 创建另一个 C++ 类的实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27439055/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com