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){
}
主要是使用了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){
}
相关文章推荐
- java对世界各个时区(TimeZone)的通用转换处理方法(转载)
- java-注解annotation
- java-模拟tomcat服务器
- java-用HttpURLConnection发送Http请求.
- java-WEB中的监听器Lisener
- 使用C++实现JNI接口需要注意的事项
- Android IPC进程间通讯机制
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- 介绍一款信息管理系统的开源框架---jeecg
- 如何组织构建多文件 C 语言程序(二)
- 聚类算法之kmeans算法java版本
- java实现 PageRank算法
- PropertyChangeListener简单理解
- c++11 + SDL2 + ffmpeg +OpenAL + java = Android播放器
- 插入排序