2011-12-08 13 views
4

アンドロイドJNIでネイティブC変数をJavaと即座に共有する方法はありますか?android JNIでJavaとCの間で変数を共有するには?

サーバがC++で書かれており(構造体の読み込み/書き込みを伴う)、クライアントのC層からデータを受け取りたい場合は、配列変数にデータの入った状況を記録し、その変数をJavaで検出してやりたいそれが可能かどうか疑問に思います。

データの到着状況についてのファイルをsdcardに書き込むことを検討しましたが、最後にやりたいことは何ですか?

答えて

0

私はアンドロイドをやっていないので、これを塩の塊で取ってください。しかし、ダイレクトバイトバッファーを使用している可能性があります。問題は何かが起こったことを知ることになるだろう。単純にバッファーをポーリングできますが、JNIを使​​用して値をポーリングするだけではそれほど優れていません。

通常のJavaでは、危険を冒したい人はsun.misc.Unsafeクラスを利用することができます。そのクラスがアンドロイドに存在するかどうかはわかりませんが、おそらくこれが助けになりますUnsafe class in Android?

1

私は最近この問題を抱えていました。私はいくつかのJavaコード(Android SDKからのみアクセス可能なもの)を実行する必要があるC++ Qt Androidプロジェクトを持っています。これを実現するには、JavaとC++コードの間でいくつかの定数を共有しなければなりませんでした。 (JavaはC++を呼び出す場合は回避する方法)作成時にJavaオブジェクトへの定数の値を渡す++

  • しているC:

    はここで可能これを実現するためのソリューションです。しかし、あなたが多くの変数を持っているなら、それは心の痛みです。

  • C++とJavaモジュールの両方で動的に解析された設定ファイルを用意しました。動作しなければならないが、試していない。
  • を維持するために....両方の場所で変数を宣言悪いアイデアとハードを直接(「含ま」)使用宣言ファイルをお持ちのC++とJavaの両方によって

私はついに最後の解決策の作品を作りました。このアイデアは、C++とJavaの両方で使用されているJavaファイルを持つことです(C++の人が多いので、この方法はわかりやすいです)。そして、このjavaファイルをヘッダファイルとしてC++にインクルードするためにプリプロセッサを使用します。これは、変数にアクセスするために、任意のJavaコードから問題なく使用することができます

package name1.name2.name3; 
import java.lang.String; 

class MyConstants 
{ 
    public static String THE_NAME() { return "Name"; } 
    public static Integer THE_VALUE() { return 12; } 
}; 

:ここ

は、Javaファイルの例(constants.java)の定数(整数や文字列)を宣言しています。メインdifficulyがあなたのため、パッケージおよびインポートラインの乗り心地を取得することでした(プリプロセッサは、この有効なC++のヘッダファイルにconstants.javaファイルを変更し

#include <string> 
using namespace std; 
#define public public: 
#define package struct mockup1 { int name3; };struct mockup2 { mockup1 name2; };int i1 = 
#define name1 mockup2() 
#define import struct mockup3 { int String; };struct mockup4 { mockup3 lang; };int i2 = 
#define java mockup4() 
#define String string 
#define Integer int 

#include "constants.java" 

#undef public 
#undef String 
#undef package 
#undef import 
#undef java 
#undef name3 

: は今、ここにどのようにそれを含めるようにC++ファイルからですマクロ名にドットを使用することはできません。悪意のあるものでなければなりません):

struct mockup1 { int name3; };struct mockup2 { mockup1 name2; };int i1 = mockup2().name2.name3; 
struct mockup3 { int String; };struct mockup4 { mockup3 lang; };int i2 = mockup4().lang.String; 

class MyConstants 
{ 
    public: static string THE_NAME() { return "Name"; } 
    public: static int THE_VALUE() { return 12; } 
}; 

ここでは、C++で定数を使用します。

int main() 
{ 
    cout << MyConstants::THE_NAME() << MyConstants::THE_VALUE() << endl; 

    return 0; 
} 
関連する問題