⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 source.cpp

📁 Java JNI。java中通过JNI接口与C或C++编写的本地代码库(*.DLL)互相调用。 本例中不但在Java中调用C++代码
💻 CPP
字号:
// source.cpp: implementation of the source class.
//
//////////////////////////////////////////////////////////////////////

#include "cn_itcast_TestNative.h"
#include "cn_itcast_JavaClassA.h"
#include "cn_itcast_UseJavaString.h"
#include "windows.h"
#include <string>
#include <algorithm>
#include <iostream>
using namespace std;

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
JNIEXPORT void JNICALL Java_cn_itcast_TestNative_sayhello(JNIEnv *env, jobject obj)
{
	/*
	cout<<"This is my first Native Code.hahahaha~"<<endl;
	jclass class_TestNative = env->GetObjectClass(obj);
	jfieldID id_num = env->GetFieldID(class_TestNative, "IntB", "I");
	jint number = env->GetIntField(obj, id_num);
	cout<< number <<endl;
	env->SetIntField(obj, id_num, 7777L);
	*/
	jclass clazz_TestNative = env->GetObjectClass(obj);
	jfieldID id_p = env->GetFieldID(clazz_TestNative, "p", "Lcn/itcast/Father;");
	jobject p = env->GetObjectField(obj, id_p);
	jclass clazz_Father = env->FindClass("cn/itcast/Father");
	jmethodID id_Father_function = env->GetMethodID(clazz_Father, "function", "()V");
	env->CallVoidMethod(p, id_Father_function);

}	

JNIEXPORT void JNICALL Java_cn_itcast_TestNative_Test(JNIEnv *env, jobject obj)
{
	//jclass myJavaClazzA = env->FindClass("cn/itcast/JavaClassA");
	//jmethodID jmethodid = env->GetMethodID(myJavaClazzA, "function", "(I)Ljava/lang/String;");
	jclass myJavaClazzB = env->GetObjectClass(obj);
	jfieldID fieldIDB = env->GetFieldID(myJavaClazzB, "IntB" , "I" );
	jmethodID methodID = env->GetMethodID(myJavaClazzB, "function", "(ILjava/sql/Date;[I)I");
	//jmethodID methodID = env->GetMethodID(myJavaClazzB, "function", "(I)I");
	cout<<"begin to CallIntMethod"<<endl;
	env->CallIntMethod(obj, methodID, 0L, NULL, NULL);
	jint jintA = env->GetIntField(obj,fieldIDB);
	cout<<jintA<<endl;
	cout<<"complete to CallIntMethod"<<endl;
	

}

JNIEXPORT void JNICALL Java_cn_itcast_TestNative_saySetGetField(JNIEnv *env, jobject obj)
{
	/*	cout<<"This is my first Native Code.hahahaha~"<<endl;
	jclass class_TestNative = env->GetObjectClass(obj);
	jfieldID id_num = env->GetFieldID(class_TestNative, "IntB", "I");
	jint number = env->GetIntField(obj, id_num);
	cout<< number <<endl;
	env->SetIntField(obj, id_num, (long)7777);*/

	jclass clazz_TestNative = env->GetObjectClass(obj);
	jfieldID id_p = env->GetFieldID(clazz_TestNative, "p", "Lcn/itcast/Father;");
	jobject p = env->GetObjectField(obj, id_p);
	jclass clazz_Father = env->FindClass("cn/itcast/Father");
	jmethodID id_Father_function = env->GetMethodID(clazz_Father, "function", "()V");
	jclass clazz_Child = env->FindClass("cn/itcast/Child");
	env->CallVoidMethod(p, id_Father_function);
	env->CallNonvirtualVoidMethod(p, clazz_TestNative, id_Father_function);
	
	//jclass clazz_TestNative = env->GetObjectClass(obj);
	jfieldID id_str = env->GetFieldID(clazz_TestNative, "str", "Ljava/lang/String;");
	
	
}

JNIEXPORT void JNICALL Java_cn_itcast_JavaClassA_Nativefunction(JNIEnv *env, jobject obj)
{
	jclass myJavaClazzA = env->FindClass("cn/itcast/JavaClassA");
	jmethodID jmethodid = env->GetMethodID(myJavaClazzA, "function", "(I)Z");
	env->CallIntMethod(obj, jmethodid, 654321);
}

JNIEXPORT void JNICALL Java_cn_itcast_TestNative_outputDate(JNIEnv *env, jclass jclazz)
{
	jclass clazz_date = env->FindClass("java/util/Date");
	jmethodID mid_date_con = env->GetMethodID(clazz_date, "<init>", "()V");
	jobject now = env->NewObject(clazz_date, mid_date_con);
	jmethodID mid_date_getTime = env->GetMethodID(clazz_date, "getTime", "()J");
	jlong time = env->CallLongMethod(now, mid_date_getTime);
	
	cout<< (long)time <<endl;

}

JNIEXPORT void JNICALL Java_cn_itcast_UseJavaString_callCppFunction(JNIEnv *env, jobject obj)
{
	//jclass clazz_
	jfieldID fid_msg = env->GetFieldID(env->GetObjectClass(obj), "message", "Ljava/lang/String;");
	jstring j_msg = (jstring)env->GetObjectField(obj, fid_msg);
	//const jchar* jstr = env->GetStringCritical(j_msg, NULL);
	jsize len = env->GetStringLength(j_msg);
	jchar* jstr = new jchar[len + 1];
	jstr[len] = L'\0';
	env->GetStringRegion(j_msg, 0, len, jstr);
	
	
	wstring wstr((const wchar_t*)jstr);

	std::reverse(wstr.begin(), wstr.end());
	jstring j_new_str = env->NewString((const unsigned short *)wstr.c_str(), wstr.size());

	env->SetObjectField(obj, fid_msg, j_new_str);
	MessageBoxW(NULL, (const wchar_t*)jstr, NULL, MB_OK);
	//env->ReleaseStringCritical(j_msg, jstr);
	
	delete [] jstr;
	
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -