Android中JNI高级应用 本地C代码中创建Java对象及本地JNI对象的保存

摘要:
以位图的构造为例。位图没有可从外部访问的Java对象创建和构造方法的代码,因此其实例化必须在JNI的c=Bitmap-˃pixelRef()中实现;jobjectobj=env-˃AllocObject;如果{env-˃CallVoidMethod;如果{obj=NULL;}}returnobj;}GBitmap_该类通过:jclassc=env-˃FindClass获得;gBitmap_ class=env-˃NewGlobalRef;//gBitmap_ ConstructorMethodID是位图构造方法的jmethodID:;总之,如何在c#中访问Java对象的属性:1)通过JNIEnv::FindClass()找到相应的jclass;2) 通过JNIEnv::GetMethodID()找到类的构造方法的jfieldID;3) 通过JNIEnv::AllocObject创建此类对象;4) 通过JNIEnv::CallVoidMethod()调用Java对象的构造函数。以JNICCameraContext为例:JNICCAMERAContext是android_hardware_相机中定义的类型。cpp将在cpp中生成对象,这些对象与android.hhardware的mNativeContext关联。Java中的相机。

++++++++++++++++++++++++++++++++++++++++++

本文系本站原创,欢迎转载! 转载请注明出处:

http://blog.csdn.net/mr_raptor/article/details/7401178

++++++++++++++++++++++++++++++++++++++++++

本地C代码中创建Java对象

创建Java域的对象就是创建Java类的实例,再调用Java类的构造方法。

以Bitmap的构建为例,Bitmap中并没有Java对象创建的代码及外部能访问的构造方法,所以它的实例化必然是在JNI的c中实现的。

BitmapFactory.java中提供了得到Bitmap的方法,时序简化为:

BitmapFactory.java ->BitmapFactory.cpp -> GraphicsJNI::createBitmap() [graphics.cpp]

GraphicsJNI::createBitmap()[graphics.cpp]的实现:

而gBitmap_class的得到是通过:

总结一下,c中如何访问Java对象的属性:

1) 通过JNIEnv::FindClass()找到对应的jclass;

2) 通过JNIEnv::GetMethodID()找到类的构造方法的jfieldID;

3) 通过JNIEnv::AllocObject创建该类的对象;

4) 通过JNIEnv::CallVoidMethod()调用Java对象的构造方法。

本地JNI对象的保存

c域中某次被调用生成的对象,在其他函数调用时是不可见的,虽然可以设置全局变量但那不是好的解决方式,Android中通常是在Java域中定义一个int型的变量,在c域生成对象的地方,与这个Java域的变量关联,在别的使用到的地方,在从这个变量中取值。

以JNICameraContext为例来说明:

JNICameraContext是android_hardware_camera.cpp中定义的类型,并会在cpp中生成对象,与Java中android.hardware.Camera的mNativeContext关联。

在注册native函数之前,c中就已经把Java域中的属性的jfieldID得到了。通过下列方法

如果执行成功,把field保存到上面图中的fileds变量的context:jfieldID中。

生成cpp对象时,通过JNIEnv::SetIntField()设置为Java对象的属性


而要使用时,又通过JNIEnv::GetIntField()获取Java对象的属性,并转化为JNICameraContext类型:

总结一下,c++中生成的对象如何保存和使用:

1) 通过JNIEnv::FindClass()找到对应的jclass;

2) 通过JNIEnv::GetFieldID()找到类中属性的jfieldID;

3) 某个调用过程中,生成cpp对象时,通过JNIEnv::SetIntField()设置为Java对象的属性;

4) 另外的调用过程中,通过JNIEnv::GetIntField()获取Java对象的属性,再转化为真实的对象类型。

JNI完全详解:http://mindprod.com/jgloss/jni.html

免责声明:文章转载自《Android中JNI高级应用 本地C代码中创建Java对象及本地JNI对象的保存》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇k8s命令Mongo Plugin插件(编辑器PyCharm的Mongo插件安装与使用)下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

vue 优化小技巧 之 require.context()

1、require.context() 回忆一下 当我们引入组件时   第一步 创建一个子组件   第二步 import ... form ...     第三步 components:{..}       第四步 页面使用 <...></...>   代码实现:                                 ...

Asp.net Core 系列之--4.事务、日志及错误处理

ChuanGoing 2019-11-17     这篇原本想把事务处理、日志处理、错误处理、授权与鉴权一并介绍完的,授权和鉴权我想结合自定义权限来介绍,全部放到这里篇幅可能太长,因此权限部分将会在下篇来介绍。先说下我接下来的打算把,下篇将介绍权限控制,结合Oauth2.0和OpenId(OIDC)以及自定义权限来介绍;完了后会结合之前所介绍的基础来实现一...

android绘图—Paint path 旋转

http://meteor6789.blog.163.com/blog/static/35040733201111193535153/ Piant 看一段代码: mPaint = new Paint();mPaint.setAntiAlias(true);//锯齿mPaint.setDither(true);//mPaint.setColor(0xFF3...

软件项目技术点(7)——在canvas上绘制自定义图形

AxeSlide软件项目梳理   canvas绘图系列知识点整理 图形种类 目前我们软件可以绘制出来的形状有如下这几种,作为开发者我们一直想支持用户可以拖拽的类似word里面图形库,但目前还没有找到比较合适的库。 下图中所有的图形都是我们自己写代码在canvas上绘制方法出来的,可以改变实心/空心,改变颜色,大小宽高,线条弯曲度,透明度等。 父类sha...

下载.xlsx文件 报错解决方法

下载.xlsx文件时,下载后的文件总是提示错误 错误提示: Excel在“12.xlsx”中发现不可读取内容。是否恢复工作簿的内容?如果信任此工作簿的来源,请单击“是”。 单击“是”后:Excel 已完成文件级验证和修复。此工作簿的某些部分可能已被修复或丢弃。 解决之后的下载代码如下: FileStream fileStream=new FileStre...

Android中对内存和外存的读写

首先给大家介绍使用文件如何对数据进行存储,Activity提供了openFileOutput()方法可以用于把数据输出到文件中,具体的实现过程与在J2SE环境中保存数据到文件中是一样的。 public void save(){try {FileOutputStream outStream=this.openFileOutput(“a.txt”,Contex...