新建 一個項目 名字:testJin 包名:com.TanSon.org python命令:python create_project.py -project testJin -package com.TanSon.org -language cpp java
1 c++ 調用 andriod python
1.1 包含頭文件android
#if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID) #include <jni.h> #include "platform/android/jni/JniHelper.h" #include <android/log.h> #endif
1.2 經過 jni 調用 java ,,(請裏是調用java類裏的表靜態函數)c++
#if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID) //判斷當前是否爲Android平臺
JniMethodInfo minfo;//定義Jni函數信息結構體
// com/TanSon/org/ 是建項目時的包簽名,用 '/' 替換 '.' , testJin 類名,建項目時,cocos2dx 自動以項目名字,在對應 com/TanSon/org/ 裏建立的一個類。 testFun: 要調用java 的函數,"()V" :括號裏是參數,後是返回值,這裏是無參無返回
bool isHave = JniHelper::getStaticMethodInfo(minfo,"com/TanSon/org/testJin","testFun", "()V");
if (!isHave)
{
CCLOG("jni:此函數不存在");
}
else{
CCLOG("jni:此函數存在");
//調用此函數
minfo.env->CallStaticVoidMethod(minfo.classID, minfo.methodID);
}
CCLOG("jni-java函數執行完畢");
#endif
1.3 java 裏的函數編寫 ,,在 testJin 類裏 加個靜態函數 testFuneclipse
static public void testFun() { Log.e("tanson", "testFun call in java"); Activity context = (Activity) Cocos2dxHelper.getsContext(); Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); context.startActivityForResult(intent, 1); //調用相機,結果在下個函數返回 }
再加個相機返回的處理函數 ide
@Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { //相機返回 super.onActivityResult(requestCode, resultCode, data); if (resultCode == Activity.RESULT_OK) { //顯示圖片名字 String name = new DateFormat().format("yyyyMMdd_hhmmss",Calendar.getInstance(Locale.CHINA)) + ".jpg"; Toast.makeText(this, name, Toast.LENGTH_LONG).show(); Bundle bundle = data.getExtras(); Bitmap bitmap = (Bitmap) bundle.get("data");// 獲取相機返回的數據,並轉換爲Bitmap圖片格式 if (bitmap != null) { final byte[] pixels = new byte[bitmap.getWidth() * bitmap.getHeight() * 4]; final ByteBuffer buf = ByteBuffer.wrap(pixels); buf.order(ByteOrder.nativeOrder()); bitmap.copyPixelsToBuffer(buf); testJin.SetImgByte(bitmap.getWidth(),bitmap.getHeight(), pixels); // SetImgByte 函數下面講,,這個是 java 調用c++ 函數,把圖片數據傳到c++
}
}
}
private static native void SetImgByte(final int pWidth, final int pHeight, final byte[] pPixels); /// 鏈接到c++裏的函數,在testJin 類裏先聲明一下, 靜態
2 java 調用 c++ 函數
在要調用 c++的類裏面,先聲明一下函數。如上面 SetImgBytethis
再在c++裏寫上 按 jni 格式的 代碼:google
#if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID) extern "C" { // 格式 Java_ + 類的路徑,+ 函數名字 ,參數前兩個不變,後機是java 調用傳過來的參數 void Java_com_TanSon_org_testLua2_SetImgByte(JNIEnv* env, jobject thiz,int width, int height,jbyteArray pixels) { int size = width * height * 4; unsigned char * pImgData = new unsigned char[size]; env->GetByteArrayRegion(pixels, 0, size, (jbyte*)pImgData); CCLOG("=========java call c++ SetImgByte() size:%d",size); AppDelegate::sImgData = pImgData; // HelloWorld::changeStr = tempStr; } } #endif