访问非静态方法
//访问非静态方法(JNI)
JNIEXPORT void JNICALL Java_com_zzqqiang_Jni_1Test_accessMethod
(JNIEnv * env, jobject jobj) {
//jclass
jclass jclz = (*env)->GetObjectClass(env, jobj);
//jmethodId
//方法的名字,方法的签名
jmethodID mid = (*env)->GetMethodID(env, jclz, "getRandomInt", "(I)I");
//调用
jint random = (*env)->CallIntMethod(env, jobj, mid, 200);
printf("C random: %d \n", random);
}
public class JniMain {
public native void accessMethod();
//java
public int getRandomInt(int value);
}
访问静态方法
//JNI 访问Java 中的静态方法(JNI)
JNIEXPORT void JNICALL Java_com_zzqqiang_1Test_accessStaticMethod
(JNIEnv *env, jobject jobj) {
//jclass, 通过jobjcct 来搜索class,如果找到了,将这个class 转变成jclass,然后返回。
jclass clz = (*env)->GetObjectClass(env, jobj);
//jmethdId,GETStaticMethodID 方法的名字,方法的签名
jmethodID jmid = (*env)->GetStaticMethodID(env, clz, "getRandeomUUId", "()Ljava/lang/String;");
// 调用静态方法
jstring uuid = (*env)->CallStaticObjectMethod(env, clz, jmid);
//jstring -> char *
char * uuid_c = (*env)->GetStringUTFChars(env, uuid, NULL);
// uuid.txt
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
public class JniMain {
public native void accessStaticMethod();
public static String getUUID() {
return UUID.randomUUID().toString();
}
}
访问Java的构造方法
//访问java构造方法
JNIEXPORT jobject JNICALL Java_com_zzqqiang_1Test_acceessConstructor
(JNIEnv * env, jobject jobj) {
//通过类的路径来从JVM中找到对应的类
jclass jclz = (*env)->FindClass(env,"java/util/Date");
//获取构造函数的methodID 所有构造函数传入的函数名都为“<init>”
jmethodID jmid =(*env)->GetMethodID(env,jclz,"<init>","()V");
//调用newobject 实例化Date对象,返回值是一个object
jobject date_obj = (*env)->NewObject(env,jclz,jmid);
//得到对应对象的方法,前提是,我们访问了相关对象的构造函数创建了这个对象
jmethodID time_mid = (*env)->GetMethodID(env,jclz,"getTime","()J");
jlong time = (*env)->CallLongMethod(env,date_obj_time_mid);
printf("time:%lld",time)
return date_obj;
}
//java
public class JniMain {
public native Date accessConstructor();
}
访问基本类型数据数组
JNIEXPORT void JNICALL Java_com_zzqqiang_1Test_giveArray
(JNIEnv * env, jobject jobj, jintArray arr) {
//局部声明
int compare(jint * a, jint *b);
//jintArray -> jint *
jint *elemts = (*env)->GetIntArrayElements(env, arr, NULL);
if (elemts == NULL)
{
return;
}
//数组长度
int len = (*env)->GetArrayLength(env, arr);
qsort(elemts, len, sizeof(jint), compare);
//释放可能的内存
//将JNI 修改的数据重新写回原来的内存
(*env)->ReleaseIntArrayElements(env, arr, elemts, JNI_COMMIT);
}
//比较函数
int compare(jint * a, jint *b) {
return *a - *b;
}
//java
public class JniMain {
public native void giveArray(int[] inArray);
}
访问引用数据类型数组
JNIEXPORT jobjectArray JNICALL Java_com_zzqqiang_1Test_initStringArray
(JNIEnv * env, jobject jobj, jint size) {
//创建jobjectArray
jobjectArray result;
jclass jclz;
int i;
jclz = (*env)->FindClass(env,"java/lang/String");
if (jclz==null) {
return NULL;
}
result = (*env)->NewObjectArray(env,size,jclz,jobj);
if (result == NULL) {
return NULL;
}
//赋值
for(int I=0;i<size;i++) {
//C 字符串
char * c_str = (char *)malloc(256);
memset(c_str,0,256);
//将int 转换成为char
sprintf(c_str, "hello num: %d\n", i);
//C ->jstring
jstring str = (*env)->NewStringUTF(env, c_str);
if (str == NULL) {
return NULL;
}
//将jstring 赋值给数组
(*env)->SetObjectArrayElement(env, result, i, str);
free(c_str);
c_str = NULL;
}
return result;
}
//java
public class JniMain {
public native String[] initStringArray(int size);
}
网友评论