2015-07-20 15 views
5

Tôi làm theo hướng dẫn được nêu trong liên kết dưới đây Call c function from Java và sau đó tôi có thể thực hiện cuộc gọi đến hàm C++. Nhưng bây giờ tôi muốn gọi hàm thành viên của lớp C++ từ Java. Để đưa ra một bức tranh rõ ràng về nó, tôi trích dẫn kịch bản dưới đây.Không thể gọi chức năng thành viên của C++ từ java bằng JNI

JAVA. Có một lớp được gọi là HelloWorld.java và nó có hàm gốc được gọi là print() Bây giờ sử dụng JNI của Java, tôi đã tạo tệp tiêu đề tương đương cho HelloWorld. Sau đó tôi đã viết implemenation của tập tin tiêu đề này trong HelloWorld.cpp

Bây giờ từ "HelloWorld.cpp" Tôi muốn gọi hàm thành viên của "rectangle.cpp" mà Tôi đã tạo ra đối tượng của "hình chữ nhật" và được gọi là hàm tương ứng của nó. Nhưng khi biên dịch mã, nó cho tôi một lỗi được gọi là "biểu tượng bên ngoài chưa được giải quyết". Trên các trái khi tôi viết tất cả các implemenation trong tập tin tiêu đề tương ứng "rectangle.cpp" đó là trong rectangle.h, mã biên dịch tốt và nó đã cho tôi mong muốn kết quả. Câu hỏi của tôi, Không có cách nào, sau đó tôi có thể gọi chức năng thành viên của .cpp lớp không phải là tệp tiêu đề tương ứng của nó.

Dưới đây là đoạn mã ::

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;  
} 

Issue gắn với mã aforewritten: Khi tôi đã viết tất cả các thực hiện "hình chữ nhật" trong tập tin tiêu đề của nó "rectangle.h", nó đã cho tôi kết quả mong muốn. Vấn đề là đối tượng "hình chữ nhật" được tạo trên tệp "HelloWorld.cpp" không đề cập đến "rectangle.cpp". Đó là lý do tại sao khi tôi biên soạn và chạy nó, nó đã cho tôi ngoại lệ "chưa được giải quyết" ngoại lệ, có nghĩa là, trình biên dịch hoặc trình gỡ rối không thể tìm thấy sự triển khai cho hàm được định nghĩa trong tệp "rectangel.h". Có cách nào để giải quyết vấn đề này không .. Vui lòng trợ giúp.

+0

Bạn cần phải biên dịch cả HelloWorld.cpp và rectangle.cpp và bao gồm chúng trong tập tin thư viện HelloWorld của bạn. Tôi đã kiểm tra ví dụ của bạn. Nó hoạt động. – havogt

+3

Cảm ơn rất nhiều @havogt .. Nhưng nếu tôi muốn gọi một ứng dụng C++ bao gồm hơn chục tập tin. Tôi có phải đề cập đến tất cả những người trong khi biên dịch. –

+3

Bạn luôn phải làm điều này (trừ khi nó được thực hiện hoàn toàn bởi IDE của bạn). – havogt

Trả lời

0

Trong trường hợp bạn muốn sử dụng nhiều nguồn khác nhau, hãy chắc chắn để:

  • hoặc đặt tất cả mọi thứ bên trong thư viện duy nhất, hoặc
  • hãy chắc chắn để tạo nhiều thư viện và đảm bảo liên kết đúng đối với họ.

Bạn có thể tìm mẫu rất đơn giản ở đây:

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

Các vấn đề liên quan