安卓JNI使用C++类
安卓JNI使用C++类,同时可使用C++的类成员变量,这就必须保证程序持续保存Native状态,即长期维护C++对象的地址。完成初始化之后,需要使用对象成员的java层函数需要传入对象的地址。
一、Native类-对象的初始化
1. 一个Java类的数据成员
private FeelJulyGpsMap mNativeDetector;//分类器声明!用于标识使用C++对象地址
//摄像机参数:用于缩放!
CamParam mCamParam =null;
//JNI2.用于识别的JNI代码!
private long mNativeObj = 0;
//用于追踪测试!
public long mNativeObjCvT = 0;
2. 使用的Native库
//JNI1.使用JNI的C++库
static {
System.loadLibrary("feelJulyGpsMap");
}
3.使用的JNI函数:
//2.JNI函数!
//四、追踪函数-OpenCV!wishchin!!!
private static native long trackInitJni(String cascadeName);
4.Java初始化函数
//1.主要处理函数!
public int trackInit()
{
mCamParam = new CamParam();//初始化摄像机参数!wishchin!!!
String cascadeName ="";
mNativeObjCvT = trackInitJni(cascadeName);//长期维持mNativeObjCvT 值,作为对象的地址 return 1;
}
5.java使用的函数
mTrack6Dof = new CTrack6Dof();
if(null!= mTrack6Dof){
mTrack6Dof.trackInit();//初始化参数!参数对象全局变量已封装!
}
上述过程完成native对象的初始化,java层长期保持 mNativeObjCvT 的值作为JNI层的传入地址。
二、Native类-对象成员的使用
1. 在java层,可以传入地址使用C++层的对象的数据和函数
@SuppressLint("SdCardPath")
public Mat onCameraFrame(CvCameraViewFrame inputFrame) { mRgba = inputFrame.rgba();
mGray = inputFrame.gray(); //0.检测面部的原始代码!//Detect 面部的代码,使用C++!wishchin!
//detectFace( mGray, mRgba); //JNI//wishchin !
if (mTrack6Dof.mNativeObjCvT != 0 && mTrack6Dof.mCamParam!=null){
//1.测试追踪!
mTrack6Dof.trackOneFrame( M );//trackInit(); }
2. 所使用的JNI接口函数的函数
//主要处理函数,追踪一帧图像!
@SuppressLint("SdCardPath")
public int trackOneFrame( Mat frame )
{
Mat frameRf= frame.clone();
Mat rvec = new Mat();rvec =Mat.zeros(3,1,CvType.CV_64FC1);
Mat tvec = new Mat();tvec =Mat.zeros(3,1,CvType.CV_64FC1); jniTrackProject(
mNativeObjCvT,
frame.getNativeObjAddr(),
mCamParam.intrinsic_Mat.getNativeObjAddr(),
mCamParam.disCoeff.getNativeObjAddr(),
mCamParam.object_pointsM.getNativeObjAddr()
,(mCamParam.axisM).getNativeObjAddr()
,frameRf.getNativeObjAddr()
,rvec.getNativeObjAddr()
,tvec.getNativeObjAddr()
);
}
所使用的 mNativeObjCvT, 值为对象的C++层地址。
3. trackProject()的函数原型:
//取代trackJniRf的输出,多输出几个参数!
//把画图的投影点带出JNI层!
private static native int jniTrackProject(
long thiz,
long frame
,long intrinsic_Mat, long disCoeff, long object_pointsM , long axisM
,long frameRf
,long rvec,long tvec //The next Input! The Draw OutPut!
);
使用 long thiz, 这个参数代表对象的地址参数输入....
上述过程完成对本地C++对象的数据成员进行更新,并取成员值,完成第本地对象的使用。
安卓JNI使用C++类的更多相关文章
- 安卓JNI精细化讲解,让你彻底了解JNI(一):环境搭建与HelloWord
目录 1.基础概念 ├──1.1.JNI ├──1.2.NDK ├──1.3.CMake与ndk-build 2.环境搭建 3.Native C++ 项目(HelloWord案例) ├── 3.1.项 ...
- 安卓JNI精细化讲解,让你彻底了解JNI(二):用法解析
目录 用法解析 ├── 1.JNI函数 │ ├── 1.1.extern "C" │ ├── 1.2.JNIEXPORT.JNICALL │ ├── 1.3.函数名 │ ├── 1 ...
- 安卓---JNI使用
交叉编译 系统平台:Windows.Mac OS.Linux CPU平台:ARM.X86.MIPS 概念:在一个平台下打包编译出还有一个平台能够运行的程序#交叉编译原理 源代码->预编译-> ...
- 安卓JNI使用OpenCV
OpenCV也有Java数据结构的包,不过计算速度还是很慢,非不得已不使用此种方式调用OpenCV.使用NDK编写底层OpenCv的调用代码,使用JNI对代码进行封装,可以稍微提高一点效率. 参考链接 ...
- 针对安卓java入门:类和对象
定义类 class Dog { String name; int age; void jump(){ } } 生成对象: public class Test { public static void ...
- 安卓开发之HttpURLConnection类和Handler类的使用
package com.lidaochen.test; import java.io.ByteArrayOutputStream; import java.io.InputStream; public ...
- 解决安卓JNI native 线程不能正常退出问题二
直面这个解决方法的可以看我转载的博客 https://www.cnblogs.com/Carlsblog/p/9438016.html 本方法是个投机取巧法,不过也解决了不能正常 ...
- 在安卓JNI/NDK中使用C++11
在VS下编写的程序移植到Eclipse下,出现了问题: this file requires compiler and library support for iso C++ 2011 standar ...
- Java Native Interfce三在JNI中使用Java类的普通方法与变量
本文是<The Java Native Interface Programmer's Guide and Specification>读书笔记 前面我们学习了如何在JNI中通过参数来使用J ...
随机推荐
- 调用ms自带的合成语音TTS
通过import of Component导入封装TTS引擎,然后选择: 最后调用: MyVoce := CoSpVoice.Create; MyVoce.Pause;//暂停 MyVoce.Stat ...
- 【[Offer收割]编程练习赛12 B】一面砖墙
[题目链接]:http://hihocoder.com/problemset/problem/1494 [题意] [题解] 显然只要记住每一行的各个砖头的间隔处的坐标有多少个就好了: ->也就对 ...
- CSVHelper在Asp.Net MVC中的使用
1,从数据库读取数据,然后导出CSV文件 [HttpPost] public FileResult ExportCSV() { var apps =....//linq以及EF从数据库查询数据 Mem ...
- Grails用CONSOLE测试,比写集成测试还快
一般,这个可以用过开发当中的脚本测试吧. 如果正规的开发流程里,集成测试显然可以作为报告提交,必不可少.
- asp.net--mvc--异步编程
Using Asynchronous Methods in ASP.NET MVC 4 asp.net mvc中的异步只能增加系统的性能,原来需要500个线程的,现在需要50个就够了,对一些常规的程序 ...
- [bzoj3697]采药人的路径_点分治
采药人的路径 bzoj-3697 题目大意:给你一个n个节点的树,每条边分为阴性和阳性,求满足条件的链的个数,使得这条链上阴性的边的条数等于阳性的边的条数,且这条链上存在一个节点,这个节点到一个端点的 ...
- linux给文件或文件夹加入apache权限
系统环境:ubuntu11.10/apache2/php5.3.6 在LAMP环境中,測试一个简单的php文件上传功能时,发现/var/log/apache2/error.log中出现例如以下php警 ...
- SQL Server高速导入数据分享
SQL Server高速导入数据,能够尝试的方法例如以下:CTE.OpenRowSet/OpenDataSource.BULK INSERT.bcp.Shell. 以下依次介绍这几种办法. 1.CTE ...
- 苹果iPhone6为何拯救不了富士康?
最近有媒体报道,富士康正在招聘10万名新员工,这比美国5个州不论什么一个大城市的市民都还多.而招这些工人的目的就是生产下一代iPhone手机.分析师估计该手机的推出时间将在10月.对此,英国的< ...
- GTK经常使用控件之行编辑( GtkEntry )
行编辑,仅仅同意输入一行内容的控件.如password输入框. 行编辑的创建: GtkWidget *gtk_entry_new(void); 返回值:行编辑指针 设置行编辑内容的最大长度: void ...