您的位置:首页 > 移动开发 > Cocos引擎

JNI针对于cocos2dx

2016-06-06 16:48 423 查看
这篇博文主要是记录一些做过的,不是一些有太多技术深度的。

主要是使用了Java和c++语言相互函数调用,达到指令或者数据在各个语言间的传输的目的。原来开发cocos2dx游戏所以使用了一些与之相关的,主要体现在c++调用java static函数的时候,使用:JniHelper,JniMethodInfo。

1、Java调用c函数
首先java调用c,主要是通过直接调用在java中声明的一个protected native 函数来调用实际定义在c中的函数:

首先在java中声明此函数,以便于调用:
protected native void JavaCall(int arg0);

在c++定义Java中声明的函数(注意:对于在c++中使用c编译成c的函数要使用“extern "C"{}”指明,因为c语言编译完成在内存中使用的是“-JavaCall”,但是在c++由于为了函数的重载,所以编译成的名称是“_JavaCall_int”):

extern "C"

{
JNIEXPORT void JNICALL Java_packageName_AppActivity_JavaCall(JNIEnv*  env, jobject ob, jint value)
{
LuaAndC *er;
er->CallLuaIntegral((int)value);
}



此函数中“Java_packageName_AppActivity_JavaCall”是函数的函数名,其中指明了JavaCall函数所在的包名,类名,和函数名

2、c调用Java
c调用java主要是通过调用java静态方法来实现,而且主要使用了cocos2dx封装的了JniHelper等。

cpp

JniMethodInfo t;
if (!JniHelper::getStaticMethodInfo(t, 
"packageName/AppActivity",
"CCall", 
"(ILjava/lang/String;Ljava/lang/String;)V")) 
{
return;
}

同样也是通过包名直接获取到函数,对于getStaticMethodInfo函数主要要注意的是第四个参数,此参数说明了被调用的Java函数的参数列表和返回值,一般的int是“I”,long是“J”,bool是“Z”,char是“C”,string是作为对象对待是“Ljava/lang/String;”,double是“D”,float是“F”,void是“V”。然后就是直接调用函数和释放资源(注意要做数据类型的转化):

jstring _shareStr = t.env->NewStringUTF(shareStr.c_str());//字符串转化

t.env->CallStaticVoidMethod(t.classID,t.methodID,type,_shareStr,_Imgpath);//调用函数

t.env->DeleteLocalRef(_shareStr);
t.env->DeleteLocalRef(t.classID);//删除资源。

java:

static public void
CCall(int arg0, String arg1, String arg2){
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  cocos2d-x java c语言 jni