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对对象所做修改,原生同样更改。
(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对对象所做修改,原生同样更改。
相关文章推荐
- objective-C学习笔记(六)继承与多态
- iOS的Objective-C的工厂设计模式详解
- org.json.JSONException: Unterminated object at character 97 of
- 深入理解Objective-C的Runtime机制
- IOS 封装上线 All object files and libraries for bitcode must be generated from.
- object-c 结构体
- java类object
- Java中Class类与Object类之间有什么关系?
- Runtime运行时
- 1.6 Object model
- JavaScript 笔记 - Object 类型
- 设计模式之Value Object模式
- Object新方法总结
- OC中initialize方法和init方法的区别
- Objective-C Method Swizzling 的最佳实践
- RAC object remastering ( Dynamic remastering )
- java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to java.lang.String
- effective objective c 2.0
- Objective-C编码规范
- Objective-C 静态库调用解析