gpt4 book ai didi

java - 无法使用JNI从java调用C++的成员函数

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:50:40 28 4
gpt4 key购买 nike

我按照以下链接中给出的说明进行操作 Call c function from Java 之后我就可以调用 C++ 函数了。 但是现在我想从 Java 调用 C++ 类的成员函数。 为了清楚地描述它,我引用了下面的场景。

java 。 有一个类叫做 HelloWorld.java 它有一个名为 print() 的原生函数 现在使用 Java 的 JNI 我创建了 HelloWorld 的等效头文件。 之后我写了实现 HelloWorld.cpp 中的这个头文件

现在我想从“HelloWorld.cpp”调用 “rectangle.cpp”的成员函数我创建了“矩形”对象,并且调用了它对应的函数。 但是在编译代码时它给了我一个错误 称为“未解析的外部符号”。在 相反,当我把所有的实现都写在 相应的头文件“rectangle.cpp”即 在 rectangle.h 中,代码编译得很好,它给出了 我想要的结果。 我的问题,有没有办法,接下来我可以调用.cpp的成员函数 类不是其对应的头文件函数。

下面是代码片段::

Hello World .java

 class HelloWorld {

private native void print();
private native void multiply();


public static void main(String[] args) {
new HelloWorld().print();
new HelloWorld().multiply();

}

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

Hello World .h

/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class HelloWorld */

#ifndef _Included_HelloWorld
#define _Included_HelloWorld
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: HelloWorld
* Method: print
* Signature: ()V
*/

JNIEXPORT void JNICALL Java_HelloWorld_print
(JNIEnv *, jobject);

/*
* Class: HelloWorld
* Method: multiply
* Signature: ()V
*/
JNIEXPORT void JNICALL Java_HelloWorld_multiply
(JNIEnv *, jobject);

#ifdef __cplusplus
}
#endif
#endif

Hello World .cpp

 #include <jni.h>
#include <stdio.h>
#include "rectangle.h"
#include "HelloWorld.h"



JNIEXPORT void JNICALL Java_HelloWorld_print(JNIEnv *env, jobject
obj)
{
// printf("Hello World!dfdfdfdf\n");
// return;

Rectangle rectangle;
rectangle.set_values(3,4);
printf("Area of Rectangle %d", rectangle.get_values());

}
JNIEXPORT void JNICALL Java_HelloWorld_multiply
(JNIEnv *, jobject)
{
//printf("dila ");
}

矩形.h

#ifndef GUARD_SNAKE_H
#define GUARD_SNAKE_H
class Rectangle{
public:
Rectangle(void);
// ~Rectangle();


void set_values(int x,int y);
int get_values();
private:
int width;
int height;


};

#endif

矩形.cpp

// classes example
#include "rectangle.h"
Rectangle::Rectangle(void)
{
}
void Rectangle::set_values(int x, int y)
{
width = x;
height = y;
}
int Rectangle::get_values()
{
return width*height;
}

与上述代码相关的问题:当我在其头文件“rectangle.h”中编写“rectangle”的所有实现时,它给了我想要的结果。问题是在“HelloWorld.cpp”文件上创建的“矩形”对象没有引用“rectangle.cpp”。这就是为什么当我编译并运行它时,它给了我“未解析的外部符号”异常,这意味着编译器或调试器无法找到“rectangel.h”文件中定义的函数的实现。有什么办法可以解决这个问题。。请帮忙。

最佳答案

如果您想使用多个来源,请确保:

  • 要么将所有内容放入单个库中,要么
  • 确保创建多个库并确保正确链接到它们。

您可以在这里找到非常简单的示例:

https://github.com/mkowsiak/jnicookbook/tree/master/recipes/recipeNo021 https://github.com/mkowsiak/jnicookbook/tree/master/recipes/recipeNo023

关于java - 无法使用JNI从java调用C++的成员函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31520441/

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