1. 程式人生 > >C++呼叫Android 與Android呼叫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原始碼

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

#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呼叫然後在函式裡面又呼叫了JavaJNIEXPORT 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

LOCAL_PATH := $(call my-dir)include $(CLEAR_VARS)LOCAL_LDLIBS := -llogLOCAL_MODULE := cocos2dinputLOCAL_SRC_FILES :=./jni.cppinclude $(BUILD_SHARED_LIBRARY)

記得用NDK編譯,編譯命令是:

ndk-build

上我們的效果圖:


           

再分享一下我老師大神的人工智慧教程吧。零基礎!通俗易懂!風趣幽默!還帶黃段子!希望你也加入到我們人工智慧的隊伍中來!https://blog.csdn.net/jiangjunshow