前言:JNI缓存!
-----------分割线-----
java代码:
public static void main(String[] args) {
TestJni tj = new TestJni();
for (int i = 0; i < 30; i++) {
tj.cashStrategy();
}
}
// 缓存
public native void cashStrategy();
// 加载动态库
static {
System.loadLibrary("JNI");
}
C代码:
#include"com_fly_TestJni.h"
JNIEXPORT void JNICALL Java_com_fly_TestJni_cashStrategy
(JNIEnv *env, jobject job){
static jstring cashString;
if (cashString == NULL)
{
printf("creat\n");
cashString = (*env)->NewStringUTF(env, "测试");
}
else{
printf("notcreat\n");
}
}
运行:
--------分割线-----------
弱全局引用 :
节省内存,在内存不足时可以是释放所引用的对象,可以引用一个不常用的对象,如果为NULL,临时创建 。
创建:NewWeakGlobalRef,销毁:DeleteGlobalWeakRef
Java代码:
public static void main(String[] args) {
TestJni tj = new TestJni();
tj.cashStrategy();
// 显示告诉jvm释放内存,但我发现我在调用fmy.cashStrategy();还是不为空 可能是由jvm决定什么回收吧
tj.releaseStrategy();
// notcreat
tj.cashStrategy();
}
// 缓存全局
public native String cashStrategy();
// 释放全局弱引用缓存
public native void releaseStrategy();
// 加载动态库
static {
System.loadLibrary("JNI");
}
C代码:
#include"com_fly_TestJni.h"
jstring cash_string;
JNIEXPORT jstring JNICALL Java_com_fly_TestJni_cashStrategy
(JNIEnv *env, jobject job){
if (cash_string == NULL)
{
printf("creat\n");
cash_string = (*env)->NewWeakGlobalRef(env, (*env)->NewStringUTF(env, "测试"));
}
else{
printf("notcreat\n");
}
return cash_string;
}
JNIEXPORT void JNICALL Java_com_fly_TestJni_releaseStrategy
(JNIEnv *env, jobject job){
(*env)->DeleteGlobalRef(env, cash_string);
}
运行截图:
------------完----------