Android JNI(四)————JNI_在由C语言编写的JNI本地函数中如何控制Java端的代码
来源:互联网 发布:猿飞菖蒲 知乎 编辑:程序博客网 时间:2024/06/06 08:45
第一步:java端代码
class JniTest {private int intField;public JniTest(int num) {intField = num;System.out.println("[java] JniTest(int num):intField = " + intField);}public int callByNative(int num) {System.out.println("[java] jniTest callByNative(int num)");return num;}public void callTest(){System.out.println("[java] JniTest callTest : intField = " + intField);}}public class JniFuncMain {private static int staticIntField = 300;static {System.loadLibrary("jnifunc");}public static native JniTest createJniObject();public static void main(String args[]) {System.out.println("[java] createJniObject()");JniTest jniObj = createJniObject();jniObj.callTest();}}
第二步:生成函数原型头文件(略)
第三步:C++/C端代码(本例中为C++)
#include <jni.h>#include <stdio.h>#include "JniFuncMain.h"/* * Class: JniFuncMain * Method: createJniObject * Signature: ()LJniTest; */JNIEXPORT jobject JNICALL Java_JniFuncMain_createJniObject(JNIEnv *env, jclass clazz){jfieldID fid;jint staticIntField;jclass targetClass;jmethodID mid;jobject newObject;jint result;/*获取JniFuncMain类的staticIntField变量值*/fid = env->GetStaticFieldID(clazz,"staticIntField","I");staticIntField = env->GetStaticIntField(clazz,fid);printf("[cpp] JniFuncMain.staticIntField = %d\n",staticIntField);/* 查找生成对象的类*/targetClass = env->FindClass("JniTest");/*查找构造方法*/mid = env->GetMethodID(targetClass,"<init>","(I)V");/*生成JniTest对象*/printf("[cpp] create JniTest\n");newObject = env->NewObject(targetClass,mid,100);/*调用对象的方法*/mid = env->GetMethodID(targetClass,"callByNative","(I)I");result = env->CallIntMethod(newObject,mid,200);/*设置JniObject 对象的intField值*/fid = env->GetFieldID(targetClass,"intField","I");printf("[cpp] set JniTest intField = 200\n");env->SetIntField(newObject,fid,result);/*返回对象的引用*/return newObject;
}
总结:
一、通过JNI,获取成员变量值
1、查找含有待访问成员变量的JniFuncMain类的jclass值
2、获取staticIntField变量的ID值
fid = env->GetStaticFieldID(clazz,"staticIntField","I");
3、读取jclass与fieldid指定的成员变量的值
staticIntField = env->GetStaticIntField(clazz,fid);
二、生成对象
1、查找生成对象的类
2、查找生成类的构造方法
3、生成JniTest类对象(返回对象引用)
阅读全文
0 0
- Android JNI(四)————JNI_在由C语言编写的JNI本地函数中如何控制Java端的代码
- Android JNI(三)————JNI_在java中调用C函数(显示映射)
- Android JNI(二)————JNI_在java中调用C库函数(隐式建立)
- Android JNI编程(八)——体验AS2.2.2编写Jni程序、Java调C、C调Java函数、将C代码中的Log打印至Logcat
- Android: JNI本地函数控制Java端代码
- IntelliJ IDEA平台下JNI编程(四)—本地C代码访问JAVA对象
- JNI中如何在本地代码中生成和操作Java的对象和字符串,并编写应用实例
- 【Tech-Android-Jni】JNI在本地函数中生成Java层的对象
- 在java中调用c语言——JNI入门
- Android中JNI高级应用 - 本地C代码中创建Java对象及本地JNI对象的保存
- Android中JNI高级应用 - 本地C代码中创建Java对象及本地JNI对象的保存 .
- Android中JNI高级应用 - 本地C代码中创建Java对象及本地JNI对象的保存
- 《Android JNI》05 在JNI中调用Java的函数
- 本地方法(JNI)——从java 程序中调用C函数
- JNI中在被调用的C/C++函数中如何访问Java程序中的类,并编写应用实例
- Android For JNI(一)——JNI的概念以及C语言开发工具dev-c++,编写你的第一个C语言程序,使用C启动JAVA程序
- Android For JNI(一)——JNI的概念以及C语言开发工具dev-c++,编写你的第一个C语言程序,使用C启动JAVA程序
- android中jni学习——jni的调用
- 测试
- 1009. 说反话 (20)
- time函数相关
- [区间DP入门 括号匹配]Brackets POJ
- J
- Android JNI(四)————JNI_在由C语言编写的JNI本地函数中如何控制Java端的代码
- 自定义listview实现类似通讯录的分组
- 文章标题
- 单例模式设计
- bzoj1700[Usaco2007 Jan]Problem Solving 解题
- USACO-section1.2.2 transform
- Unity3D 做个RPG手机游戏--0 开发前准备工作
- 状压DP<poj2686>
- Linux SSH tools Xshell 5