2015-07-20 137 views
5

我按照下面说的链接 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”文件中定义的函数的实现。有没有办法解决这个问题.. 请帮助。

+0

您需要编译两个HelloWorld.cpp和rectangle.cpp,包括他们在您的HelloWorld库文件。我测试了你的例子。有用。 – havogt

+3

非常感谢@havogt ..但是如果我想调用包含十几个文件的C++应用程序,该怎么办?编译时,我是否必须提及所有这些内容? –

+3

你总是必须这样做(除非它是由IDE隐式完成的)。 – havogt

回答