アンドロイドJNIでネイティブC変数をJavaと即座に共有する方法はありますか?android JNIでJavaとCの間で変数を共有するには?
サーバがC++で書かれており(構造体の読み込み/書き込みを伴う)、クライアントのC層からデータを受け取りたい場合は、配列変数にデータの入った状況を記録し、その変数をJavaで検出してやりたいそれが可能かどうか疑問に思います。
データの到着状況についてのファイルをsdcardに書き込むことを検討しましたが、最後にやりたいことは何ですか?
アンドロイドJNIでネイティブC変数をJavaと即座に共有する方法はありますか?android JNIでJavaとCの間で変数を共有するには?
サーバがC++で書かれており(構造体の読み込み/書き込みを伴う)、クライアントのC層からデータを受け取りたい場合は、配列変数にデータの入った状況を記録し、その変数をJavaで検出してやりたいそれが可能かどうか疑問に思います。
データの到着状況についてのファイルをsdcardに書き込むことを検討しましたが、最後にやりたいことは何ですか?
私はアンドロイドをやっていないので、これを塩の塊で取ってください。しかし、ダイレクトバイトバッファーを使用している可能性があります。問題は何かが起こったことを知ることになるだろう。単純にバッファーをポーリングできますが、JNIを使用して値をポーリングするだけではそれほど優れていません。
通常のJavaでは、危険を冒したい人はsun.misc.Unsafeクラスを利用することができます。そのクラスがアンドロイドに存在するかどうかはわかりませんが、おそらくこれが助けになりますUnsafe class in Android?。
私は最近この問題を抱えていました。私はいくつかのJavaコード(Android SDKからのみアクセス可能なもの)を実行する必要があるC++ Qt Androidプロジェクトを持っています。これを実現するには、Javaと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;
}