这篇博文主要是记录一些做过的,不是一些有太多技术深度的。
主要是使用了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++之间进行函数调用,包括Java调用C++函数及C++调用Java静态方法的具体实现过程。文章详细解释了使用JNI(Java Native Interface)进行跨语言通信的方法。
3437

被折叠的 条评论
为什么被折叠?



