2015-07-20 90 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

回答