我按照下面说的链接 Call c function from Java 给出的指令,之后我就可以调用C++函数。 但是现在我想从Java调用C++类的成员函数。 为了清楚地描述它,我引用了下面的场景。无法使用JNI从java调用C++的成员函数使用JNI
JAVA。 有一个名为HelloWorld.java 的类,它具有原生函数print()
现在使用Java的JNI我已经为HelloWorld创建了 等效头文件。 这之后,我在HelloWorld.cpp
写了这个头文件的实行 现在从“HelloWorld.cpp”我要打电话,而 我创建的对象“rectangle.cpp”的 成员函数“矩形”和 称为其相应的功能。 但是在编译代码时,它会给我一个名为“未解析的外部符号”的错误 。在 相反,当我写下 相应的头文件“rectangle.cpp”中的所有实现时,这个头文件是 在rectangle.h中,代码编译的很好,它给了我想要的结果。 我的问题,没有一种方法, 其次我可以调用.cpp 类的成员函数而不是其相应的头文件funcion。
下面的代码片段::
HelloWorld.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");
} }
HelloWorld.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
HelloWorld.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 ");
}
rectangle.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
rectangle.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;
}
与aforewritten代码相关的问题:当我在它的头文件“rectangle.h”写道:“矩形”的所有实现,它给了我想要的结果。问题是在“HelloWorld.cpp”文件上创建的“矩形”对象不是指“rectangle.cpp”。这就是为什么当我编译并运行它时,它给了我“无法解析的外部符号”异常,这意味着编译器或调试器无法找到在“rectangel.h”文件中定义的函数的实现。有没有办法解决这个问题.. 请帮助。
您需要编译两个HelloWorld.cpp和rectangle.cpp,包括他们在您的HelloWorld库文件。我测试了你的例子。有用。 – havogt
非常感谢@havogt ..但是如果我想调用包含十几个文件的C++应用程序,该怎么办?编译时,我是否必须提及所有这些内容? –
你总是必须这样做(除非它是由IDE隐式完成的)。 – havogt