cocos2dx C++调用android,android调用C++
C++调用android
java部分: 一个类,一个静态方法,一个实例方法
public class AppActivity extends Cocos2dxActivity{
public static Context mContext; //记录类实例
@Override
protected void onCreate(Bundle savedInstanceState) {
mContext = AppActivity .this;
}
// c++中調用的方法
public static Object rtnActivity() {
System.out.println("----------rtnActivity");
return mContext;
}
public void showAD() {
System.out.println("showAD 成功");
}
}
C++部分:
#include "cocos2d.h"
//将所有代码包含在预编译块里,防止找不到<jni.h>报错
USING_NS_CC;
#include <vector>
using namespace std;
#include "JniTest.h"
#if (CC_TARGET_PLATFORM==CC_PLATFORM_ANDROID)
#include <jni.h> //这个文件在ndk中,所以放在预编判断块中,不然编译器找不到这个文件会报错
#include "platform/android/jni/JniHelper.h"
JniTest::JniTest()
{
}
JniTest::~JniTest()
{
}
//请求广告
void JniTest::ddcallAd()
{
//定义Jni函数信息结构体;
JniMethodInfo minfo;
//返回一个bool值表示是否找到此函数;
bool isHave = JniHelper::getStaticMethodInfo
(minfo,"org/cocos2dx/lua/MergeAppActivity","rtnActivity", "()Ljava/lang/Object;");
jobject activityObj;
if (isHave) {
//CallStaticObjectMethod调用java函数,并把返回值赋值给activityObj
activityObj = minfo.env->CallStaticObjectMethod(minfo.classID, minfo.methodID);
isHave = JniHelper::getMethodInfo(
minfo,"org/cocos2dx/lua/MergeAppActivity","showAD","()V");
if (!isHave)
{
cocos2d::log("jni:showAD 函数不存在;");
}
else
{
//调用displayWebView函数,并传入参数
minfo.env->CallVoidMethod(activityObj, minfo.methodID);
}
}
}
#endif
先getStaticMethodInfo找到静态方法,
CallStaticObjectMethod执行静态方法得到类实例,
getMethodInfo再找实例方法,
CallVoidMethod再调用实例方法。
android调用C++
1:c++层代码示例,建立一个CPP的类
#if(CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID) #include "platform/android/jni/JniHelper.h" #include <jni.h> extern "C" {
//java传入一个string,无返回值,严格按照这个格式JAVA_方法路径【以_隔开】(JNIENV* env,jobject this,方法参数)
JNIEXPORT void JNICALL Java_org_cocos2dx_cpp_AppActivity_onKeyback(JNIEnv* env,jclass clazz,jstring info)
{
//your code
}
} #endif
2:Android 层,在主Activity中添加方法
public static native void onKeyback(String info); //声明c++的方法

浙公网安备 33010602011771号