最近项目中经常用到Jni调用,在此我做一些总结,没有总结到的,下次再进行记录!
1. C++ 调用java方法,不传参无返回值的时候,可以进行直接调用,例子如下:
ZFY::JniMethodInfo methodInfo;
if (ZFY::JniHelper::getStaticMethodInfo(methodInfo,
"com/test/zfy/AndroidSystemInfo", "openURL", "()V"))
{
jstring stringArg1 = methodInfo.env->NewStringUTF(urlstring.c_str());
methodInfo.env->CallStaticVoidMethod(methodInfo.classID,methodInfo.methodID);
methodInfo.env->DeleteLocalRef(methodInfo.classID);
}
2. C++ 调用java方法,传参无返回值的时候,可以进行直接调用,例子如下:
KXCR::JniMethodInfo methodInfo;
if (ZFY::JniHelper::getStaticMethodInfo(methodInfo,
"com/test/zfy/Android", "openURL", "(Ljava/lang/String;)V"))
{
jstring stringArg1 = methodInfo.env->NewStringUTF(urlstring.c_str());
methodInfo.env->CallStaticVoidMethod(methodInfo.classID, methodInfo.methodID, stringArg1);
methodInfo.env->DeleteLocalRef(methodInfo.classID);
}
上面的就需要注意传入的参数了,C++的参数 :std::string& urlstring = "测试数据";然后就是要传入java方法的时候,用jstring承接一下然后再传入调用CallStaticVoidMethod方法。
3. C++ 调用java方法,传参有返回值的时候,可以进行直接调用,例子如下:
std::string strPath = aPath;
ZFY::JniMethodInfo methodInfo;
if (ZFY::JniHelper::getStaticMethodInfo(methodInfo,
"com/zfy/test/GameSDK", "getApkAssetsDir", "(Ljava/lang/String;)Ljava/lang/String;"))
{
jobject stringArg1 = methodInfo.env->NewStringUTF(strPath.c_str());//注意这个类型
jstring fullPath = (jstring)methodInfo.env->CallStaticObjectMethod(methodInfo.classID, methodInfo.methodID, stringArg1);//注意这个调用方法
std::string fullPathStr = std::string(ZFY::JniHelper::jstring2string(fullPath).c_str()); //C++ 拿到java方法返回值
methodInfo.env->DeleteLocalRef(methodInfo.classID);
strFullPath = fullPathStr.c_str();
}
上边的代码需要注意的就多了,首先调用方法不一样了,CallStaticObjectMethod 它跟上边方法是不同的;其次就是传入的参数不是变量了,而是类型---> jobject ;并且用 std::string fullPathStr = std::string(ZFY::JniHelper::jstring2string(fullPath).c_str()); 承接java返回的数据。
好了,其他的我就不多做介绍了,因为这三类就够用了,它们都是类似的这样方法,只是传入的参数不同而已,并且网上有那么多的资料来告诉你,C++ 、 java 、 jni 三者之间的类型转换或者传递,所以这上边的三个方法足够用了。我上边的只是一些模板而已,其他的东西靠你们自己去往里面去套用就哦了!!!
到此结束,以后遇见新问题,新经验,还会记录,不定时更新!!!