0

Android用のopenframeworksでアプリケーションを開発しています。アプリのナビゲーションに Android UI を使用したいと考えています。しかし、私のopenframeworksのコードでアンドロイドUIとのやり取りを伝える方法がブロックされています。私は JNI についてよく読んでいますが、Java から C++ コードを使用できることを理解している限りではありますが、残りのコードと相互作用させる方法がわかりません。JNI/C++ 関数を作成するときは、それを呼び出す必要があります。

extern "C" {
    ...
}

しかし、openframeworks プログラムの変数を変更できません。たとえば、Android UIからbooleanまたはintをopenframeworksに取得するにはどうすればよいですか? たぶん、私は何か不可能なことを尋ねているのでしょうか、それともポイントを逃していますか?

4

1 に答える 1

1

JNI を使用して、c++ と Java 間の通信を確立します。UI 部分は Java で行う必要があります。srcJava フォルダーと res/layout フォルダーがあることに注意してください。ADT Eclipse アドオンがあれば、main_layout.xml に簡単なボタンを追加できるはずです。次のようなものを試してください:

<cc.openframeworks.OFGLSurfaceView android:id="@+id/of_gl_surface"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"/>
    <!-- add here other views' layouts -->

    <FrameLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:fitsSystemWindows="true" >

        <LinearLayout
            android:id="@+id/fullscreen_content_controls"
            style="?buttonBarStyle"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_gravity="bottom|center_horizontal"
            android:background="@color/black_overlay"
            android:orientation="horizontal"
            tools:ignore="UselessParent">

            <Button
                android:id="@+id/myButton"
                style="?buttonBarButtonStyle"
                android:layout_width="0dp"
                android:layout_height="wrap_content"
                android:layout_weight="1"
                android:text="Bam!" />
            <!-- the text should move to a string in the values.xml -->

        </LinearLayout>
    </FrameLayout>

</RelativeLayout>

OFActivity.java では、次のようなことを試してください。

package cc.openframeworks.androidGuiExample;

import android.os.Bundle;
import android.view.KeyEvent;
import android.view.Menu;
import android.view.MenuItem;
import cc.openframeworks.OFAndroid;


public class OFActivity extends cc.openframeworks.OFActivity implements OnClickListener{

    @Override
    public void onCreate(Bundle savedInstanceState)
    { 
        super.onCreate(savedInstanceState);
        String packageName = getPackageName();

        ofApp = new OFAndroid(packageName,this);

        Button myButton = (Button) findViewById(R.id.myButton);//id from layout xml
        myButton.setOnClickListener(this);
    }
    @Override
    public void onClick(View v) {
        System.out.println(v);
    }

    @Override
    public void onDetachedFromWindow() {
    }

    @Override
    protected void onPause() {
        super.onPause();
        ofApp.pause();
    }

    @Override
    protected void onResume() {
        super.onResume();
        ofApp.resume();
    }

    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
    if (OFAndroid.keyDown(keyCode, event)) {
        return true;
    } else {
        return super.onKeyDown(keyCode, event);
    }
    }

    @Override
    public boolean onKeyUp(int keyCode, KeyEvent event) {
    if (OFAndroid.keyUp(keyCode, event)) {
        return true;
    } else {
        return super.onKeyUp(keyCode, event);
    }
    }


    OFAndroid ofApp;



    // Menus
    // http://developer.android.com/guide/topics/ui/menus.html
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Create settings menu options from here, one by one or infalting an xml
        return super.onCreateOptionsMenu(menu);
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // This passes the menu option string to OF
        // you can add additional behavior from java modifying this method
        // but keep the call to OFAndroid so OF is notified of menu events
        if(OFAndroid.menuItemSelected(item.getItemId())){

            return true;
        }
        return super.onOptionsItemSelected(item);
    }


    @Override
    public boolean onPrepareOptionsMenu (Menu menu){
        // This method is called every time the menu is opened
        //  you can add or remove menu options from here
        return  super.onPrepareOptionsMenu(menu);
    }

}

あなたは主に の最後の行の後にいますonCreate:

  • レイアウト xml からコンポーネントにアクセスするには、findViewById を使用します。
  • イベントのリスナーを設定します。異なるコンポーネントには、実装する異なるリスナーがあります。通常、フリーズを回避するために、UI スタッフ (GUI スレッド) を残りの処理から切り離すことをお勧めします。
于 2013-09-15T11:29:21.373 に答える