我按照下面說的鏈接 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