上一章已经讲了C++调用Java
http://blog.youkuaiyun.com/xiechyun/article/details/44624385
书接上一回,接着说Java调用C++
1.新建cpp函数
2.增加java函数callforcpp声明
3.实现callforcpp函数
4.调用
1.新建cpp函数
在class文件夹下新建文件beCalledFun.h文件,代码如下:
#ifndef be_Called_Fun_H
#define be_Called_Fun_H
#include "cocos2d.h"
using namespace cocos2d;
void CalledByJava(const char *tips)
{
CCLog("i am cpp function: %s", tips);
}
#endif
2.增加java函数声明
打开JavaShow.java文件,在类内声明函数
public static native void CallforCpp(String tips);
3.打开jnitoJava.cpp文件,在内实现CallforCpp,名字有点特别:Java_包名类名函数名
void Java_org_cocos2dx_cpp_JavaShow_CallforCpp(JNIEnv *env, jobject thiz, jstring tips)
{
const char * pTips = env->GetStringUTFChars(tips,NULL);
CalledByJava(pTips);//调用c++函数
env->ReleaseStringUTFChars(tips,pTips);
}
函数里调用了C++的函数CalledByJava(pTips),要包含头文件;
#include "../../Classes/beCalledFun.h"
4.调用: C++通过JIN调用java的函数,此java函数内调用c++的CalledByJava。
i)创建jni调用java的函数
在jnitojava.h中声明getTips3函数,代码如下 :
#ifndef __JniToJava_H_
#define __JniToJava_H_
extern "C"
{
void getTips();
void getTips2(const char* name);
void getTips3(const char* tips);
}
#endif
在jnitojava.cpp中实现getTips3函数,代码如下:
void getTips3(const char* tips)
{
JniMethodInfo jinfo;
if(JniHelper::getStaticMethodInfo(jinfo,CLASS_NAME,"CallforCpp","(Ljava/lang/String;)V"))
{
jstring jtips = jinfo.env->NewStringUTF(tips);
jinfo.env->CallStaticVoidMethod(jinfo.classID,jinfo.methodID,jtips);
}
}
然后在工程中调用些函数,
在helloworld.cpp文件中,点击按钮事件
void HelloWorld::menuCloseCallback(Ref* pSender)
{
#if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID)
getTips();
getTips2("printf this string");
getTips3("Cpp call java ,then java call cpp");
#endif
}
连接手机,运行,每次点击关闭按钮都会输出
CALLED: javashow::show1
CALLED: javashow:show2: printf this string
i am cpp function: Cpp call java ,then java call cpp
至此,已经完成了c++调用java,java调用c++的方法。
说得可能有点混乱,
参考http://codingnow.cn/cocos2d-x/992.html
工程class和proj.android打包了发上去可下载
http://download.youkuaiyun.com/detail/xiechyun/8533203