2011-07-12 55 views
15

Androidプラットフォームでネイティブコードでできることの制限について質問があります。Android NDKの制限?

基本的に私は、SIP/RTP用にUDPソケットを使用し、オーディオ録音/再生用のOpenALを使用するネイティブCコードでライブラリを開発しました。基本的にアプリケーション全体です。 アイデアは、Javaコードではなく、ネイティブCコードを可能な限り持たせることです。私はこれを他のプラットフォームでも使用しようとしています。

私の質問は、単にGUI用のJavaを使用してからネイティブコードですべての処理を行うことは可能ですか? ネイティブコードがソケットの作成、バインド、オーディオの録音、再生などを行うときに発生します。ネイティブコードであるため、そのアプリケーションに対するアクセス許可(マイクロフォンやその他のものにアクセスするアプリケーションなど)を設定する必要があります。それはそのネイティブコード以来このものをバイパスしますか? ネイティブコードは、PC上のようにAndroidで必要なものは何でもできますか?

ご迷惑をおかけして申し訳ありません。ただ言うと、私はそれをあなたはまだ権限を持っているあなたのアプリケーションが必要

おかげ

答えて

4

、あなたはネイティブコードにしたいほとんど何もすることができますが、実際にサポートされる唯一のOSレベルのものは、OpenGLでありますOpenSL、いくつかの数値計算ライブラリ(圧縮、数学など)があります。

しかし、いつでもJNIを使​​用してJavaメソッドを呼び出すことができるので、ネットワーク用の標準Android API(Socketなどのクラス)を使用できます。明らかに、コールはJava APIを経由しているので、すべての通常のAndroidのアクセス許可が適用されます(android.permission.INTERNETなど)。

編集:コメントで詳述したように、NDKの一部である標準ライブラリはソケットをサポートしています。

+0

あなたは「サポートされている」ということを詳しく説明できますか?たとえば、NDKライブラリリストにソケットが見つかりません。それでも使用できますか?どのヘッダファイルやものを使用しますか?sys /ソケットはありませんか? – KaiserJohaan

+1

これは好きではありませんが、Javaを使う必要があります。つまり、 'Socket'でFindClassを使い、コンストラクタのメソッド、' read'メソッド、 'write'メソッドあなたのコードに 'jobject'としてソケットを格納し、あなたは' CallVoidEnvMethod'かそれと同様のものを使います。絶対にひどいと思うが、CとJavaの間で翻訳するよりも薄いレイヤーを書くことができ、その翻訳機能のほんの一握りで終わることができる。 – EboMike

+0

Btwは、Kazukiが指摘したように、ソケットAPIを完全にサポートするかもしれませんが、個人的には私はいつもこの間接をJavaで使いました。 – EboMike

3

を改善しようとするでしょう。たとえば、マニフェストにandroid.permission.INTERNETがなければネイティブソケットは機能しません。

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

もう1つの方法は、Javaレイヤーでソケットを作成し、それをパススルーすることです。ここでは、ネイティブの土地にソケットとの相互作用の一例ですが、方法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はNDKの素晴らしい記事です。

GUI用のJavaを使用し、ネイティブコードですべての処理を行うことは可能ですか?

はい。 AndroidManifestに適切な権限を設定する必要があります。あなたはネイティブ側でオーディオを録音し、再生するためOpenSL ES APIを使用する必要が

レコードオーディオ、それを再生、

。これは、アプリケーションがAndroid 2.3以降用である必要があることを意味します。

または、NVIDIAは、Android 2.2以前の場合でも、Androidイベント、センサー、オーディオなどのC++を使用して開発できるフレームワークを提供します。

Tegra Resources - Android SDK & NDK sample applications and documentation

+0

OpenALはAndroidでサポートされていませんか?私はそれについてどこか読んだと思うか、あなたはapalにOpenAL共有ライブラリを含めることができますか? – KaiserJohaan

+0

[Android用OpenALソフトウェア実装](http://bit.ly/cc3Rpq)これはソフトウェア実装であるため、OpenSL ESはこのOpenAL実装よりも効率的です。 –

0

は、Javaアンドロイドアプリケーションに(Cで書かれている)pjsip SIPライブラリを使用した例であるcsipsimpleをチェックアウトするようなことがあります。

私はそれがソケットの通信方法を検討していませんが、あなたがしようとしていることのより完全な例を提供する必要があります。