#include <stdio.h>
#include "com_ican_twy_JniTest.h"
#include <Windows.h>
#include <string.h>
//访问非静态方法
JNIEXPORT void JNICALL Java_com_ican_twy_JniTest_accessMethod
(JNIEnv * env, jobject jobj) {
jclass jclaz = (*env)->GetObjectClass(env, jobj);
//方法的名字,方法的签名
jmethodID mid = (*env)->GetMethodID(env, jclaz, "getRandomInt", "(I)I");
//调用
jint random = (*env)->CallIntMethod(env, jobj, mid, 200);
printf("c random %d \n", random);
}
//JNI 访问Java 中的静态方法
JNIEXPORT void JNICALL Java_com_ican_twy_JniTest_accessStaticMethod
(JNIEnv * env, jobject jobj) {
//jclass, 通过jobjcct 来搜索class,如果找到了,将这个class 转变成jclass,然后返回。
jclass jc = (*env)->GetObjectClass(env, jobj);
//jmethdId,GETStaticMethodID 方法的名字,方法的签名
jmethodID jmid = (*env)->GetStaticMethodID(env, jc, "getRandeomUUId", "()Ljava/lang/String;");
// 调用静态方法
jstring jstr = (*env)->CallStaticObjectMethod(env, jc, jmid);
//jstring -> char *
char * uuid_c = (*env)->GetStringUTFChars(env, jstr, NULL);
char filename[100];
sprintf(filename, "D://%s.txt", uuid_c);
FILE *fp = fopen(filename, "w");
fputs("I love Av", fp);
fclose(fp);
printf("文件写入成功\n");
}
//访问java构造方法
JNIEXPORT jobject JNICALL Java_com_ican_twy_JniTest_accessConstructor
(JNIEnv * env, jobject jobj) {
//通过类的路径来从JVM 里面找到对应的类
jclass jc = (*env)->FindClass(env, "java/util/Date");
jmethodID jmid = (*env)->GetMethodID(env, jc, "<init>", "()V");
//调用 newObject 实例化Date 对象,返回值是一个jobjcct
jobject date_obj = (*env)->NewObject(env, jc,jmid);
//得到对应对象的方法,前提是,我们访问了相关对象的构造函数创建了这个对象
jmethodID time_mid = (*env)->GetMethodID(env, jc, "getTime", "()J");
jlong time = (*env)->CallLongMethod(env, date_obj, time_mid);
printf("time:%lld \n", time);
return date_obj;
}
JNIEXPORT jstring JNICALL Java_com_ican_twy_JniTest_chineseChars
(JNIEnv * env, jobject jobj, jstring in) {
//jboolean iscp;
//char * c_str = (*env)->GetStringChars(env, in, &iscp);
//if (iscp == JNI_TRUE)
//{
// printf("is copy: JNI_TRUE\n");
//}
//else if (iscp == JNI_FALSE)
//{
// printf("is copy: JNI_FALSE\n");
//}
//int length = (*env)->GetStringLength(env, in);
//const jchar * jcstr = (*env)->GetStringChars(env, in, NULL);
jchar -> char
//char * rtn = (char *)malloc(sizeof(char) * 2 * length + 3);
//memset(rtn, 0, sizeof(char) * 2 * length + 3);
//int size = 0;
//size = WideCharToMultiByte(CP_ACP, 0, (LPCWSTR)jcstr, length, rtn, sizeof(char) * 2 * length + 3, NULL, NULL);
//printf("string: %s\n", rtn);//string 宝宝
//if (iscp) {
// (*env)->ReleaseStringChars(env, in, c_str);// JVM 使用。通知JVM c_str 所指的空间可以释放了
//}
//return NULL;
char *c_str = "马蓉与宝宝";
jclass str_cls = (*env)->FindClass(env, "java/lang/String");
jmethodID jmid = (*env)->GetMethodID(env, str_cls, "<init>", "([BLjava/lang/String;)V");
//jstring -> jbyteArray
jbyteArray bytes = (*env)->NewByteArray(env, strlen(c_str));
// 将Char * 赋值到 bytes
(*env)->SetByteArrayRegion(env, bytes, 0, strlen(c_str), c_str);
jstring charsetName = (*env)->NewStringUTF(env, "GB2312");
return (*env)->NewObject(env, str_cls, jmid, bytes, charsetName);
}