Tôi có ứng dụng Java gọi mã C++/C gốc. Mã C++/C cần gọi lại trong Java. Bạn có thể cho tôi một số ví dụ làm thế nào để làm điều này.JNI - Cách gọi lại từ C++ hoặc C sang Java?
26
A
Trả lời
23
Có nhiều cách hợp lệ để gọi lại vào Java từ C/C++. Tôi sẽ cho bạn thấy một kỹ thuật sử dụng C (dễ điều chỉnh env cho C++), giúp dễ dàng truyền dữ liệu từ mã nguồn gốc sang mã Java. Ví dụ này chuyển các chuỗi (dễ sửa đổi đối với bất kỳ loại dữ liệu nào).
Trong mã nguồn gốc, tạo điều sau đây:
// Globals
static jmethodID midStr;
static char * sigStr = "(Ljava/lang/String;ILjava/lang/String;)V";
// Init - One time to initialize the method id, (use an init() function)
midStr = (*env)->GetMethodID(env, class, "javaDefineString", sigStr);
// Methods
static void javaDefineString(JNIEnv * env, jobject o, char * name, jint index, char * value) {
jstring string = (*env)->NewStringUTF(env, name);
(*env)->CallVoidMethod(env, o, midStr, string, index, (*env)->NewStringUTF(env, value));
}
Trong mã Java tạo như sau:
Map<String, String> strings = new HashMap<String, String>();
// Never call this from Java
void javaDefineString(String name, int index, String value) {
String key = name + "." + index;
strings.put(key, value);
}
sử dụng Native để gửi dữ liệu:
javaDefineString(env, o, "Greet", 0, "Hello from native code");
javaDefineString(env, o, "KeyTimeout", 0, "one second");
javaDefineString(env, o, "KeyTimeout", 1, "two second");
sử dụng Java để nhận dữ liệu:
System.out.println(strings.get("Greet.0");
System.out.println(strings.get("KeyTimeout.0");
System.out.println(strings.get("KeyTimeout.1");
Các vấn đề liên quan
- 1. JNI: chuyển byte từ C++ sang java
- 2. gọi hàm java từ c bằng cách sử dụng jni
- 3. Chuyển các kiểu dữ liệu từ Java sang C (hoặc ngược lại) bằng cách sử dụng JNI
- 4. JNI gọi Java từ C++ với nhiều chủ đề
- 5. Java JNI: Tạo cửa sổ xoay bằng JNI từ C
- 6. Không thể thực hiện cuộc gọi từ C++ sang Java bằng JNI
- 7. Gọi phương thức python từ C++ (hoặc C) gọi lại
- 8. Gọi C++ dll từ Java
- 9. Gọi C# dll từ Java
- 10. Force Java để gọi C++ của tôi destructor (JNI)
- 11. Rò rỉ bộ nhớ khi gọi mã java từ C bằng cách sử dụng JNI
- 12. Cách gọi một phương thức Java từ C++/JNI lấy tham số ngữ cảnh Android
- 13. Truyền chuỗi hai byte (WCHAR) từ C++ sang Java qua JNI
- 14. Làm thế nào để chuyển một cấu trúc C sang java bằng cách sử dụng JNI?
- 15. Gọi mã C# từ Java?
- 16. Ghi nhật ký thư từ C++ sang Java
- 17. Cách gọi chức năng C++ từ java
- 18. Chuyển một byte [] trong Java sang hàm trong C qua JNI: cách sử dụng jarraybyte
- 19. Gọi lại C# từ DLL
- 20. Profiling Java chạy bằng JNI cuộc gọi
- 21. Chuyển đổi từ C++ sang Java
- 22. Loại Chuyển đổi từ C sang Java
- 23. Gọi phương thức C từ mã C++/Java/C#?
- 24. Java JNI gọi để tải thư viện
- 25. Sự cố khi gọi phương thức Java từ chủ đề gốc bằng JNI (C++)
- 26. C++ có thể gọi mã Java không?
- 27. Làm cách nào để chuyển một bitmap từ Java sang C++ với JNI trong Phát triển Android?
- 28. chuỗi JNI và chuỗi C
- 29. Ứng dụng Java gọi C++ DLL qua JNI; cách tốt nhất để cấp phát bộ nhớ?
- 30. Gọi bất kỳ phương thức Java nào từ C#
Hi đã thử nhưng điều này nói ... "lỗi: 'javaDefineString' không được khai báo trong phạm vi này". Vì nó không phải là phương pháp JNI thì làm thế nào tôi có thể khai báo trong tập tin header .h. Bất kì lời đề nghị nào? – CoDe
@Shubh Mở một câu hỏi mới và thêm mã và thông tin lỗi của bạn. Chuck – Java42
Đối với những người tự hỏi, 'lớp' có thể thu được với:' class = (* env) -> GetObjectClass (env, o); ' – Diego