📄 source.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 + -