做三次测试。
(1) jniclass内写成静态变量和公共java方法。修改静态变量后,native层该量也跟着修改,传送参数为jclass。
jniinterface packet:
class JniClass{
static int count = 0;
static int count = 0;
public void print()
{
Log.i(TAG,count);
Log.i(TAG,count);
}
public native static void calljni();
}
native c++:
void *_*_*_ calljni(JNIEnv *env,
jclass c)
{
....
do something
....
jobject obj =env->AllocObject(c);
jmethodID method1 = (env)->GetMethodID(c,"print","()V");
(env)->CallVoidMethod(obj,method1);
}
in main thread:
JniClass.count = 1000;
JniClass.calljni();
打印结果: 1000;静态变量jni,java 共用。
(2) 修改为非静态变量,程序入口创建新jniclass,jni传参为jclass,原生回调java打印。
jniinterface packet:
class JniClass{
int count = 0;
int count = 0;
public void print()
{
Log.i(TAG,count);
Log.i(TAG,count);
}
public native static void calljni();
}
native c++:
void *_*_*_ calljni(JNIEnv *env,
jclass c)
{
....
do something
....
jobject obj =env->AllocObject(c);
jmethodID method1 = (env)->GetMethodID(c,"print","()V");
(env)->CallVoidMethod(obj,method1);
}
in main thread:
jniClass jclass = new JniClass();
JniClass.count = 1000;
JniClass.calljni();
打印结果: 0;jclass 是 类本身 此处为EncodeH264类,而非对象。期间做了java到c代码的解释转换。消耗资源,不建议频繁调用。jobject obj =env->AllocObject(c) 创建一个新对象。
(3) 修改为非静态变量,程序入口创建新jniclass,jni传参为jobject(
需要在jniclass中jni接口定义时去掉static),修改变量,原生回调java打印
jniinterface packet:
class JniClass{
int count = 0;
int count = 0;
public void print()
{
Log.i(TAG,count);
Log.i(TAG,count);
}
public native static void calljni();
}
native c++:
void *_*_*_ calljni(JNIEnv *env,
jobject c)
{
....
do something
....
jobject obj =env->AllocObject(c);
jmethodID method1 = (env)->GetMethodID(c,"print","()V");
(env)->CallVoidMethod(obj,method1);
}
in main thread:
jniClass jclass = new JniClass();
JniClass.count = 1000;
JniClass.calljni();
打印结果: 1000;joject是 对象。是指向该java对象的指针,期间java对对象所做修改,原生同样更改。