2014-12-16 14 views
6

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?

+1

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 –

+0

@RetoKoradi cảm ơn – SemperAmbroscus

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à , 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ố NativeActivitynative_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