新建 一个项目 名字:testJin 包名:com.TanSon.org python命令:python create_project.py -project testJin -package com.TanSon.org -language cpp
eclipse 导入项目配置 。。。 略去,(可以google)
1 c++ 调用 andriod
1.1 包含头文件
#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类里的表静态函数)
#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 类里 加个静态函数 testFun
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); //调用相机,结果在下个函数返回 }
再加个相机返回的处理函数
@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++的类里面,先声明一下函数。如上面 SetImgByte
再在c++里写上 按 jni 格式的 代码:
#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