2013-03-11 35 views
5

Tôi đang cố gắng gọi vào một lớp Java thông qua C++/JNI trên Android. Cụ thể hơn, tôi đang cố gắng gọi cho nhà xây dựng của lớp này, có một bối cảnh Android là một tham số. Tôi không có vấn đề gì khi thực hiện cuộc gọi thành công nếu constructor của tôi không có params, nhưng khi tôi đưa Context cần thiết làm tham số, tôi không biết chữ ký JNI của tôi sẽ trông như thế nào và cũng nghi ngờ điều đó có thể xảy ra vì tôi không có truy cập vào đối tượng ngữ cảnh đó.Cách gọi một phương thức Java từ C++/JNI lấy tham số ngữ cảnh Android

Vì vậy, câu hỏi của tôi là, có thể gọi cho nhà xây dựng của một lớp Java có một bối cảnh Android là thông số duy nhất của nó không? Nếu vậy, làm thế nào? Nếu không, có cách giải quyết nào không khi tôi cần bối cảnh để truy cập một số lớp API Android nhất định.

+0

thực hiện điều này giúp [Sử dụng C++ với Android ndk/jni] (http://stackoverflow.com/questions/6423078/use-c-with-android-ndk-jni)? – static

Trả lời

2

Tôi không tin nó có thể theo cách bạn đã nêu. Tuy nhiên, nếu biết cấu trúc của lớp, bạn luôn có thể tạo nó như một singleton w/một thể hiện tĩnh được khởi tạo khi khởi động Activity của bạn, do đó lớp này đạt được bối cảnh cần thiết tại thời điểm đó. Về cơ bản nó sẽ ngồi đó cho đến khi bạn sẵn sàng gọi từ C++, nhưng thực sự sẽ có sẵn để phục vụ yêu cầu của bạn với bối cảnh.

+0

cảm ơn! làm việc hoàn hảo! –

0

Khi nhận được ID phương thức của hàm tạo, bạn chỉ cần xác định cái nào bạn muốn. Hiện tại, bạn có lẽ làm một cái gì đó như:

constructor = (*env)->GetMethodID(env, cls, "<init>", "()V"); 
object = (*env)->NewObject(env, cls, constructor); 

Thay vào đó, bạn muốn chỉ định các loại lập luận khi sử dụng GetMethodID và vượt qua nó trong khi cách gọi NewObject.

constructor = (*env)->GetMethodID(env, cls, "<init>", "(Landroid/content/Context;)V"); 
object = (*env)->NewObject(env, cls, constructor, context); 
+0

cảm ơn, nhưng để cung cấp cú pháp ... bất kỳ ý tưởng nào nếu có thể đạt được ngữ cảnh có một phương thức java vượt qua nó trong lần đầu tiên? –

+0

Bạn nên chuyển một từ trong Java, giống như bạn làm trong các lớp Java. Trong khi nó có thể là có thể, nếu bạn thông minh, để xác định bối cảnh của ứng dụng, thì đây không phải là thiết kế tốt (và trong số những thứ khác, làm cho các lớp của bạn kém khả thi hơn). –

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