Tôi có một ứng dụng sẽ tận dụng lợi thế của NDK để thực hiện các yêu cầu đồ họa cao và thư viện tạo địa hình mà tôi đã viết bằng C++. Câu hỏi của tôi là nếu tôi đã tạo GUI của mình với SDK và tôi thực hiện một cuộc gọi ngẫu nhiên trong java như GLES20.glEnable(GL_CULL_FACE);
và sau đó tiến hành gọi glEnable(GL_DEPTH_TEST);
trong C++ qua JNI thì có bất kỳ lỗi/vấn đề xây dựng nào đã biết không? Trong trường hợp ai đó tự hỏi tại sao tôi hỏi điều này và/hoặc nghĩ rằng đó là một câu hỏi ngu ngốc đó là bởi vì trong OpenGL trên máy tính để bàn có một OpenGL context
hiện có (mặc dù GLFW đã chăm sóc hầu hết điều này). Tôi quan tâm nếu OpenGL ES cũng có sẵn context
. Nếu có, sẽ làm cho các cuộc gọi OpenGL ES từ cả java và C++ ghi thành context
trước đó đã nêu?Có thể thực hiện các cuộc gọi OpenGL ES từ mã C++ và Java của bạn không?
6
A
Trả lời
4
Trong OpenGL, bạn luôn xử lý ngữ cảnh, vâng. Các phần quan trọng đối với bạn là
- ngữ cảnh OpenGL của bạn ở đâu và như thế nào trong phần Java?
- là ngữ cảnh OpenGL được lưu giữ hiện tại khi gọi vào mã gốc.
Thực tế, tất cả các cuộc gọi Java tới OpenGL đều được chuyển thành mã gốc theo bất kỳ cách nào. Vì vậy, nếu bạn viết các phần của chương trình của bạn với NDK và gọi vào các phần này giống như cách bạn gọi trực tiếp vào OpenGL, thì ngữ cảnh OpenGL sẽ hiện tại và có thể sử dụng được.
2
Câu trả lời trực tiếp là Có, nhưng bạn phải cẩn thận như thế nào bạn viết C++ và mã Java
- NDK cung cấp một số
NativeActivity
vànative_app_glue
mã, giúp bạn viết tinh khiết C++ mã cho trò chơi logic, dựng hình, v.v. và giảm thiểu yêu cầu viết mã Java. Bạn sẽ tìm thấy một số chức năng điểm vào nhưandroid_main()
nếu bạn đang sử dụng theo cách này. Trong trường hợp này, bạn không thể kết hợp OpenGL với mã Java và C++ trong cùng một ngữ cảnh, vì mã gốc của bạn được chạy trong chuỗi khác nhau và liên lạc qua đường ống với chuỗi Java [Dalvik VM thread] - Gọi hàm gốc trong Java thông qua JNI, điều này sẽ trong cùng một thread, cùng bối cảnh, gọi OpenGL API trong Java hay C++ nên có sự khác biệt, cũng giống như câu trả lời của @datenwolf
Hope this helps ~
Các vấn đề liên quan
- 1. Thực hiện cuộc gọi OpenGL dư thừa
- 2. Không thể thực hiện cuộc gọi từ C++ sang Java bằng JNI
- 3. OpenGL ES 2.0 có thể không có NDK?
- 4. Hướng dẫn viết mã OpenGL và OpenGL ES tương thích?
- 5. C++ có thể gọi mã Java không?
- 6. OpenGL ES và OpenGL shaders tương thích
- 7. Thực hiện cuộc gọi cURL trong C#
- 8. Có gì "trong" và "ngoài" của OpenGL-ES? (Chuyển từ OpenGL)
- 9. C# - Cách thực hiện cuộc gọi HTTP
- 10. Tại sao chức năng OpenGL ES không thể được gọi từ một chủ đề khác
- 11. OpenGL-ES và Cg
- 12. khác biệt trong iOS OpenGL ES và Android OpenGL ES
- 13. OpenGL vs OpenGL ES 2.0 - Ứng dụng OpenGL có thể được chuyển dễ dàng không?
- 14. Chọn OpenGL ES 1.1 hoặc OpenGL ES 2.0?
- 15. Không thể thực hiện cuộc gọi JNI từ C++ sang java trong android lollipop bằng cách sử dụng jni
- 16. Bạn có thể thực hiện cuộc gọi jQuery tới dịch vụ WCF bằng SOAP và WSHttpBinding không?
- 17. Có thể tạo lớp OpenGL ES trong suốt không?
- 18. Java API để thực hiện cuộc gọi điện thoại
- 19. Có thể biết phiên bản OpenGL có phải là OpenGL ES trong mã trình đổ bóng không?
- 20. Gọi mã C# từ Java?
- 21. Gọi lại tên gọi OpenGL không thực hiện
- 22. OpenGL ES cho Iphone
- 23. Tôi có thể ngăn chặn window.onbeforeunload không được gọi khi thực hiện cuộc gọi AJAX
- 24. Tôi có thể ném ngoại lệ C++ từ cuộc gọi lại C cũ không?
- 25. C# tương đương với từ khóa 'thực hiện' của Java?
- 26. Bạn có thể gọi hàm C# từ JavaScript không?
- 27. Bạn có thể gọi một hàm javascript từ mã gốc (không phải trong cuộc gọi lại) bằng PhoneGap và iOS không?
- 28. OpenGL | ES trên máy tính để bàn
- 29. Có thể thực hiện các cuộc gọi phương thức trong PHP không?
- 30. Bạn có thể thực hiện NetTcpBinding trong mã không? Có nên không?
câu hỏi đặt ra trông có vẻ hơi khác nhau, nhưng câu trả lời của tôi ở đây giải thích cách trộn mã Java và C++ một cách an toàn khi thực hiện cuộc gọi OpenGL: http://stackoverflow.com/a/24444862/3530129 –
@RetoKoradi cảm ơn – SemperAmbroscus