2009-05-04 52 views

Trả lời

20

Ví dụ: kiểm tra Creating a JVM from C. Nó cho thấy một thủ tục mẫu để tạo ra một JVM và gọi một phương thức. Nếu JVM đã tồn tại; ví dụ. chương trình C của bạn được gọi bởi chương trình Java (tình trạng gọi lại), bạn có thể lưu vào bộ đệm JNIEnv *. Là một lời khuyên, hãy cẩn thận với con trỏ bộ nhớ đệm đến JVM từ C/C++, có một số ngữ nghĩa liên quan đến những gì bạn có thể cache và nó có thể được gọi sau này. Vì điều đó, như Brian Agnew đã chỉ ra, hãy kiểm tra tài liệu tham khảo JNI.

+0

loại yêu cầu này là những gì bạn đang tìm kiếm. câu hỏi là con của phương pháp này là phức tạp như thế nào – user63898

+0

. nhưng tôi tin rằng, không có công cụ của bên thứ 3, phương pháp duy nhất từ ​​những gì tôi đã đọc. – bbqchickenrobot

2

Đọc trên JNI.

+3

Tôi biết rằng có thể gọi các hàm C++ từ Java bằng JNI, nhưng làm cách nào bạn có thể sử dụng nó để gọi các hàm Java từ C++? –

+0

@AndersonGreen Có thể gọi các phương thức Java từ C++. Thật không may, có nhiều thông tin hơn về việc gọi C++ từ Java, nhưng tôi đã tìm thấy một vài hướng dẫn, http://www.ibm.com/developerworks/java/tutorials/j-jni/section3.html và http: //www.codeproject.com/Articles/22881/How-to-Call-Java-Functions-from-C-Using-JNI. Tôi đã có một số vấn đề với mỗi hướng dẫn, và có một số mâu thuẫn khó khăn đặc biệt trong hướng dẫn của IBM, nhưng đây là những điều tốt nhất tôi có thể tìm thấy vào lúc này. – StockB

15

Khám phá JNI Invocation interface. Điều này sẽ cho phép bạn nhúng một JVM trong ứng dụng C (hoặc C++) của bạn.

Lưu ý rằng các cơ chế khác nhau dễ dàng tồn tại hơn để tạo điều kiện gọi C/C++ từ Java (ví dụ: JNA). Có thể đáng xem xét việc đảo ngược vấn đề của bạn sao cho bạn có thể gọi từ Java (tuy nhiên, tôi hiểu điều này có thể không khả thi đối với ứng dụng cụ thể của bạn)

+1

Đây không phải là lỗi của bạn, nhưng liên kết giao diện JNI Infocation bị hỏng.Có vẻ như Oracle đã chuyển mọi tài nguyên JNI mà họ có, bởi vì các liên kết bị hỏng ở khắp nơi khi tìm kiếm thông tin JNI. – StockB

+0

Dường như liên kết đó đã được khắc phục ngay bây giờ –

1
+12

Liên kết chết. Vui lòng cập nhật – learnvst

+0

Đây là bản sao làm việc duy nhất của bài viết mà tôi có thể tìm thấy với Google: http://enos.itcollege.ee/~jpoial/oop/lugemist/JDCBook/JDCBook/jniexamp.html – mrt

3

trang này là hữu ích: http://hildstrom.com/projects/jni/index.html

Giả sử bạn có một lớp Java:

package foo; 
public class bar { 
    public static int timesTen(int input){ 
     return input * 10; 
    } 
} 

Một khi bạn có một JVM và JNIEnv * (chi tiết bỏ qua ...) bạn có thể gọi phương thức Java từ C++ như sau:

jclass myClass = env->FindClass("foo.bar"); 
jmethodID mid = env->GetStaticMethodID(myClass, "timesTen", "(I)I"); 
jint hundred = env->CallStaticIntMethod(myClass, mid, (jint)10); 

này đã che đậy một nhiều chi tiết, bao gồm cả xử lý ngoại lệ, nếu việc bỏ qua sẽ làm hỏng JVM của bạn. Đối với tất cả các chi tiết gory tìm kiếm trên "Java Native Interface" và làm theo các liên kết Oracle.

+4

Trong khi liên kết này có thể trả lời câu hỏi, tốt hơn nên bao gồm các phần thiết yếu của câu trả lời ở đây và cung cấp liên kết để tham khảo. Câu trả lời chỉ liên kết có thể trở thành không hợp lệ nếu trang được liên kết thay đổi. – Perception

-2

Một cách đơn giản khác để gọi các phương thức java từ CPP là thông qua tệp lô.

system() 

Là phương pháp gọi các tệp exe hoặc dơi từ CPP. Đặt lớp của bạn với đường dẫn java và đường dẫn lớp trong tệp lô và gọi tệp lô đó từ CPP bằng cách sử dụng system("batch-file-name.bat").

Thật dễ dàng và dễ dàng.