您的位置:首页 > 移动开发 > Objective-C

native c回调 java 中 自带参数 jclass和jobject的区别

2016-03-24 19:18 477 查看
做三次测试。

(1) jniclass内写成静态变量和公共java方法。修改静态变量后,native层该量也跟着修改,传送参数为jclass。
jniinterface packet:
class JniClass{

static int count = 0;
public void print()
{

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;
public void print()
{

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;
public void print()
{

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对对象所做修改,原生同样更改。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: