1. 程式人生 > >JNI呼叫之C++與Android

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 三者之間的型別轉換或者傳遞,所以這上邊的三個方法足夠用了。我上邊的只是一些模板而已,其他的東西靠你們自己去往裡面去套用就哦了!!!

到此結束,以後遇見新問題,新經驗,還會記錄,不定時更新!!!