2011-07-12 43 views
15

Tôi có một câu hỏi về những hạn chế của những gì bạn có thể làm trong mã gốc trên nền tảng Android. Về cơ bản tôi đã phát triển một thư viện trong mã C bản địa sử dụng ổ cắm UDP cho SIP/RTP và sử dụng OpenAL để ghi/phát lại âm thanh - về cơ bản là toàn bộ ứng dụng. Ý tưởng là có càng nhiều càng tốt trong mã C gốc hơn là mã Java. Tôi muốn làm điều này bởi vì tôi cũng sẽ sử dụng nó trên các nền tảng khác.Hạn chế NDK của Android?

Câu hỏi của tôi sau đó chỉ đơn giản là - có thể chỉ sử dụng Java cho GUI và sau đó xử lý tất cả trong mã gốc? Điều gì sẽ xảy ra khi mã gốc của tôi cố gắng tạo ổ cắm, liên kết nó, ghi âm, phát, v.v. - vì nó nằm trong mã gốc, tôi có cần thiết lập quyền cho nó (chẳng hạn như ứng dụng truy cập micrô và điều gì đó) hay không nó sẽ chỉ bỏ qua công cụ này kể từ mã nguồn gốc của nó? Mã gốc có thể thực hiện được nhiều thứ trên Android như trên PC không?

Xin lỗi nếu nó không rõ ràng; chỉ cần nói và tôi sẽ cố gắng cải thiện nó

Cảm ơn

Trả lời

4

Bạn có thể làm khá nhiều bất cứ điều gì bạn muốn trong mã nguồn gốc, nhưng điều OS cấp chỉ thực sự được hỗ trợ là OpenGL, OpenSL, và một số thư viện crunching số (nén, toán học, vv).

Tuy nhiên, bất cứ lúc nào bạn có thể sử dụng JNI để gọi một phương thức Java, vì vậy bạn có thể sử dụng API Android chuẩn để kết nối mạng (các lớp như Socket, v.v.). Rõ ràng, kể từ khi cuộc gọi đi qua API Java, tất cả các quyền Android bình thường đều được áp dụng (như android.permission.INTERNET).

EDIT: Như được xây dựng trong các nhận xét, các thư viện chuẩn là một phần của NDK có hỗ trợ cho các ổ cắm.

+0

Bạn có thể giải thích về ý nghĩa của từ 'được hỗ trợ' không? Ví dụ, tôi không thể tìm thấy ổ cắm trong danh sách thư viện NDK. Tôi vẫn có thể sử dụng chúng? Bạn sử dụng các tệp tiêu đề và nội dung nào - không có sys/sockets? – KaiserJohaan

+1

Bạn sẽ không thích điều này, nhưng ... bạn sẽ phải trải qua Java, tức là bạn sử dụng FindClass trên 'Socket', sau đó lấy phương thức cho hàm tạo, phương thức' read', phương thức để 'write' , bạn lưu trữ các socket như là một 'jobject' trong mã của bạn, và bạn sử dụng' CallVoidEnvMethod' hoặc một cái gì đó tương tự. Nghe có vẻ hoàn toàn khủng khiếp, nhưng bạn có thể viết một lớp mỏng hơn là dịch giữa C và Java và kết thúc với chỉ một số ít các chức năng dịch đó. – EboMike

+0

Btw, như Kazuki đã chỉ ra, có thể có hỗ trợ đầy đủ cho API socket, nhưng cá nhân tôi đã luôn luôn sử dụng này indirection thông qua Java. – EboMike

3

Bạn vẫn cần ứng dụng của mình để có quyền. Ví dụ: ổ cắm gốc của bạn sẽ không hoạt động nếu không có android.permission.INTERNET trong tệp kê khai.

<manifest xlmns:android...> 
... 
<uses-permission android:name="android.permission.INTERNET"></uses-permission> 
</manifest> 

Một tùy chọn khác là tạo ổ cắm ở lớp Java và truyền nó xuống. Dưới đây là một ví dụ về tương tác với các ổ cắm ở quê hương, xem phương pháp org_..._OpenSSLSocketImpl_connect():

http://www.netmite.com/android/mydroid/dalvik/libcore/x-net/src/main/native/org_apache_harmony_xnet_provider_jsse_OpenSSLSocketImpl.cpp

3

The Native Android API là một bài viết hay cho NDK.

có thể chỉ sử dụng Java cho GUI và sau đó xử lý tất cả trong mã gốc không?

Có. Và bạn cần đặt quyền thích hợp cho AndroidManifest của mình.

ghi âm, chơi nó,

Bạn cần phải sử dụng OpenSL ES API để ghi âm và chơi âm thanh ở phía mẹ đẻ. Điều đó có nghĩa là ứng dụng của bạn phải dành cho Android 2.3 trở lên.

Hoặc, NVIDIA cung cấp một khuôn khổ cho phép chúng tôi có thể phát triển bằng cách sử dụng C++ cho sự kiện Android, cảm biến, âm thanh, v.v. mặc dù cho Android 2.2 trở về trước.

Tegra Resources - Android SDK & NDK sample applications and documentation

+0

OpenAL có được hỗ trợ bởi Android không? Tôi nghĩ rằng tôi đọc ở đâu đó về nó, hoặc rằng bạn chỉ có thể bao gồm thư viện được chia sẻ OpenAL trong apk? – KaiserJohaan

+0

[Triển khai phần mềm OpenAL dành cho Android] (http://bit.ly/cc3Rpq). Đó là một phần mềm thực hiện, do đó, OpenSL ES là hiệu quả hơn so với thực hiện OpenAL này. –

0

Bạn có thể muốn kiểm tra csipsimple mà là một ví dụ về sử dụng thư viện pjsip ngụm (được viết bằng C) trong một ứng dụng android java.

Tôi chưa xem xét cách giao tiếp ổ cắm nhưng nó sẽ cung cấp cho bạn một ví dụ hoàn chỉnh hơn về những gì bạn đang cố gắng làm.