JNI针对于cocos2dx

本文介绍如何在Java和C++之间进行函数调用,包括Java调用C++函数及C++调用Java静态方法的具体实现过程。文章详细解释了使用JNI(Java Native Interface)进行跨语言通信的方法。

这篇博文主要是记录一些做过的,不是一些有太多技术深度的。

主要是使用了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){
}

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值