新建 一个项目 名字: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#include"platform/android/jni/JniHelper.h"#include
#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 voidtestFun() {
Log.e("tanson", "testFun call in java");
Activity context=(Activity) Cocos2dxHelper.getsContext();
Intent intent= newIntent(MediaStore.ACTION_IMAGE_CAPTURE);
context.startActivityForResult(intent,1); //调用相机,结果在下个函数返回
}
再加个相机返回的处理函数
protected void onActivityResult(int requestCode, intresultCode, 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) {
finalbyte[] 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 intpWidth,
finalint 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, intheight,jbyteArray pixels)
{int size = width * height * 4;
unsignedchar * 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
原文:http://www.cnblogs.com/sanjin/p/3737135.html