JNI调用之C++与Android

           最近项目中经常用到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 三者之间的类型转换或者传递,所以这上边的三个方法足够用了。我上边的只是一些模板而已,其他的东西靠你们自己去往里面去套用就哦了!!!

 

到此结束,以后遇见新问题,新经验,还会记录,不定时更新!!!

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值