当前位置:编程学习 > C/C++ >>

C++调用Android 与Android调用C++ 例子

现在我们在Android上玩到的游戏,大都是由C++编写的,然后通过NDK编译,才能运行在Android上。而C++与Android之间的交互,通过NDK这个编译工具。那么C++与Android之间是如何交互的?
 
Android调用C++,我们通过从C++返回一个String来作为例子。
 
C++调用Android,这里通过弹出一个提示框。
 
 
Android工程名:com.example.cocos2dinput
 
Activity名:MainActivity
 
首先是Android层的MainActivity源代码:
 
[cpp] 
public class MainActivity extends Activity {  
      
    TextView ContentTextView;  
    Button buttonCallC;  
    String contentString;  
    public static Context mContext;  
  
    @Override  
    protected void onCreate(Bundle savedInstanceState) {  
        super.onCreate(savedInstanceState);  
        setContentView(R.layout.activity_main);  
          
          
        contentString=getStringFromC();  
        ContentTextView=(TextView)findViewById(R.id.text1);  
        ContentTextView.setText(contentString);  
        button=(Button)findViewById(R.id.button1);  
        buttonCallC=(Button)findViewById(R.id.button2);  
          
        mContext=this.getApplicationContext();  
          
        buttonCallC.setOnClickListener(new OnClickListener() {  
              
            @Override  
            public void onClick(View v) {  
                // TODO Auto-generated method stub  
                callShowMessage();  
                  
            }  
        });  
          
    }  
      
    public void showMessage()  
    {  
        Log.d("showMessage", "showMessage");  
        AlertDialog.Builder builder=new Builder(this);  
        builder.setTitle("C++调用Android");  
        builder.setMessage("这是一个C++调用Android的例子");  
        builder.show();  
          
    }  
      
    public native String callShowMessage();  
      
    public native String getStringFromC();  
      
  
    @Override  
    public boolean onCreateOptionsMenu(Menu menu) {  
        // Inflate the menu; this adds items to the action bar if it is present.  
        getMenuInflater().inflate(R.menu.main, menu);  
        return true;  
    }  
      
    static{  
        System.loadLibrary("cocos2dinput");  
    }  
  
}  
 
 
下面是jni.cpp 
[cpp]  
#include<string.h>  
#include<jni.h>  
#include<android/log.h>  
  
  
JNIEnv *g_env;  
jobject *g_object;  
  
  
extern "C"  
{  
  
JNIEXPORT jstring JNICALL Java_com_example_cocos2dinput_MainActivity_getStringFromC(JNIEnv* env,jobject thiz)  
{  
    return env->NewStringUTF("callCMessageBox");  
}  
  
//下面的函数首先被Android调用然后在函数里面又调用了Java  
JNIEXPORT jint JNICALL Java_com_example_cocos2dinput_MainActivity_callShowMessage(JNIEnv* env,jobject thiz)  
{  
    jmethodID notification_method = env->GetMethodID(env->GetObjectClass(thiz),"showMessage","()V");  
    env->CallVoidMethod(thiz,notification_method);  
    return 0;  
}  
}  
 
Android.mk
[cpp]  
LOCAL_PATH := $(call my-dir)  
  
include $(CLEAR_VARS)  
  
LOCAL_LDLIBS := -llog  
  
LOCAL_MODULE := cocos2dinput  
  
LOCAL_SRC_FILES :=./jni.cpp  
  
include $(BUILD_SHARED_LIBRARY)  
 
记得用NDK编译,编译命令是:
[cpp]  
ndk-build  

补充:软件开发 , C++ ,
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,