JNI传递字符串数组J-StringArray
编译器对语言的转换以寻地址的方式进行序列化和反序列化,因此对于不固定类型或者不显示给出大小的对象不能直接解析,所以没有出现jstringArray这样的类型,只能一个一个编写。
参考链接:安卓开发提高篇-Jarray
1.使用的C++函数
//调用标定相机的函数!wishchin !!!
int CFrameProcess::CamCabPro(
std::vector<std::string> &filenames,
Mat &intrinsic_Mat, Mat &disCoeff,
Mat &object_points, Mat &axis)
{
vector<Mat> inputFrames;
for (int i=0;i< filenames.size();++i)
{
Mat t = cv::imread(filenames[i].c_str(),1);
inputFrames.push_back(t);
} camCalib myCamCalib;
MyCamera cam;
bool isDetected = myCamCalib.cameraCab(inputFrames , cam); intrinsic_Mat = cam.intrinsic_Mat.clone() ;
disCoeff = cam.disCoeff.clone() ;
object_points = cam.object_pointsM.clone() ;
axis = cam.axisM.clone() ; return isDetected;
}
2.JNI接口函数
extern "C" jint
Java_com_example_feeljulygpsmap_FeelJulyActivity_trackInitParamS
(JNIEnv *jenv, jclass
,jobject thiz
,jstring file0
,jstring file1
,jstring file2
,jstring file3
,jstring file4
,jstring file5
,jstring file6
,jstring file7
,jstring file8
,jstring file9
,jstring file10
,jlong intrinsic_Mat,jlong disCoeff,jlong object_pointsM ,jlong axisM
)
{
std::vector<std::string> filenames(11); string stdFileName="";
jStr2StdStr(jenv, file0,stdFileName);
filenames[0]=stdFileName;
jStr2StdStr(jenv, file1,stdFileName);
filenames[1]=stdFileName;
jStr2StdStr(jenv, file2,stdFileName);
filenames[2]=stdFileName;
jStr2StdStr(jenv, file3,stdFileName);
filenames[3]=stdFileName;
jStr2StdStr(jenv, file4,stdFileName);
filenames[4]=stdFileName;
jStr2StdStr(jenv, file5,stdFileName);
filenames[5]=stdFileName;
jStr2StdStr(jenv, file0,stdFileName);
filenames[6]=stdFileName;
jStr2StdStr(jenv, file7,stdFileName);
filenames[7]=stdFileName;
jStr2StdStr(jenv, file8,stdFileName);
filenames[8]=stdFileName;
jStr2StdStr(jenv, file9,stdFileName);
filenames[9]=stdFileName;
jStr2StdStr(jenv, file10,stdFileName);
filenames[10]=stdFileName; ((CFrameProcess*)thiz)->CamCabPro(
filenames,
*((Mat*)intrinsic_Mat) , *((Mat*)disCoeff) ,
*((Mat*)object_pointsM) , *((Mat*)axisM) ); return 1;
}
转换函数:
inline void jStr2StdStr(JNIEnv *jenv, jstring SSrc,std::string SDst)
{
const char* jnamestr = jenv->GetStringUTFChars(SSrc, NULL);
string stdFileName(jnamestr);
SDst =stdFileName; }
3.Java层的定义和调用
调用:
@SuppressLint("SdCardPath")
private int trackInitParamJ(CamParam mCamParam,Vector<String> filenames)
{
//使用java初始化,读取文件!
//trackInitParam(mCamParam);
filenames.add(0,"/sdcard/DevCv/Picture/209.jpg");
filenames.add(1,"/sdcard/DevCv/Picture/240.jpg");
filenames.add(2,"/sdcard/DevCv/Picture/287.jpg");
filenames.add(3,"/sdcard/DevCv/Picture/300.jpg");
filenames.add(4,"/sdcard/DevCv/Picture/339.jpg");
filenames.add(5,"/sdcard/DevCv/Picture/356.jpg");
filenames.add(6,"/sdcard/DevCv/Picture/371.jpg");
filenames.add(7,"/sdcard/DevCv/Picture/404.jpg");
filenames.add(8,"/sdcard/DevCv/Picture/414.jpg");
filenames.add(9,"/sdcard/DevCv/Picture/743.jpg");
filenames.add(10,"/sdcard/DevCv/Picture/761.jpg");
trackInitParamS(
mNativeObjCvT
,filenames.get(0)
,filenames.get(1)
,filenames.get(2)
,filenames.get(3)
,filenames.get(4)
,filenames.get(5)
,filenames.get(6)
,filenames.get(7)
,filenames.get(8)
,filenames.get(9)
,filenames.get(10)
,mCamParam.intrinsic_Mat.getNativeObjAddr()
,mCamParam.disCoeff.getNativeObjAddr()
,mCamParam.object_pointsM.getNativeObjAddr()
,(mCamParam.axisM).getNativeObjAddr()
);
return 1;
}
定义:
private static native long trackInitParamS(
long thiz
,String file0
,String file1
,String file2
,String file3
,String file4
,String file5
,String file6
,String file7
,String file8
,String file9
,String file10
,long intrinsic_Mat, long disCoeff, long object_pointsM , long axisM );
JNI传递字符串数组J-StringArray的更多相关文章
- JNI 中文字符串传递(转)
源:JNI 中文字符串传递 因为项目编码中通过JNI传递中文字符时出现乱码问题,特搜集了相关资料,整理如下: java内部是使用16bit的unicode编码(UTF-16)来表示字符串的,无论中文英 ...
- Java层与Jni层的数组传递(转)
源:Java层与Jni层的数组传递 Android开发中,经常会在Java代码与Jni层之间传递数组(byte[]),一个典型的应用是Java层把需要发送给客户端的数据流传递到Jni层,由Jni层的S ...
- JNI C创建Java字符串数组
创建Java字符串数组 注:jni中没有与String[]对应的数据类型,所以需要创建对象数组,循环添加jstring对象 #include <Sample3.h> #include &l ...
- Android开发实践:Java层与Jni层的数组传递
转载:http://www.linuxidc.com/Linux/2014-03/97561.htm Android开发中,经常会在Java代码与Jni层之间传递数组(byte[]),一个典型的应用是 ...
- Android JNI 传递对象
JNI初步入门后,在传递数据的时候,遇到一个需求:有多个数据需要在Java与C代码之间进行传递.如果都做为函数参数传入,则函数很长很难看,并且多个数据的返回也不好实现.所以想到了把数据打包后传递.这在 ...
- java求字符串数组交集、并集和差集
import java.util.HashMap; import java.util.HashSet; import java.util.LinkedList; import java.util.Ma ...
- .net字符串数组查找方式效率比较
下面是代码: static void Main(string[] args) { string[] arr = new string[] { "AAA", "BBBB&q ...
- 随笔 JS 字符串 分割成字符串数组 并动态添加到指定ID的DOM 里
JS /* * 字符串 分割成字符串数组 并动态添加到指定ID的DOM 里 * @id 要插入到DOM元素的ID * * 输入值为图片URL 字符串 * */ function addImages(i ...
- js 字符串分割成字符串数组 遍历数组插入指定DOM里 原生JS效果
使用的TP3.2 JS字符串分割成字符串数组 var images='{$content.pictureurl} ' ;结构是这样 attachment/picture/uploadify/20141 ...
随机推荐
- Python 3 条件语句
条件语句: 用于判定,判定是否符合某条件,符合则执行,不符合则不执行该条件所定义的操作. 一步判定: 用于理解不会这样使用. if 1==1: if条件判定只能出现一次. print(&q ...
- 《高性能MySQL》笔记-BLOB与TEXT
BLOB和TEXT都是为存储很大的数据而设计的字符串数据类型,分别采用二进制和字符方式存储. 实际上,它们分别属于两组不同的数据类型家族: 字符类型是TINYTEXT,SMALLTEXT,TEXT,M ...
- hdu_1020_Encoding_201310172120
Encoding Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total S ...
- Mac OSX:安装zsh
想在mac下安装oh my zsh,按照https://github.com/robbyrussell/oh-my-zsh上的文档,执行下面这条命令安装:curl -L http://install. ...
- 关于重置IOS App请求推送的授权请求
项目要加入推送通知.測试完本地通知后.发现測不了远程通知.于是想重置授权请求. 下面是重置授权请求的方法: 方法一: 通用->还原->抹掉全部内容和设置 可是第一种方法非常费时,抹掉内容预 ...
- linux下环境变量C_INCLUDE_PATH
环境变量定义一般都是/etc/profile文件(对所有用户有效),或者在Home目录下的.bashrc或.profile(只对当前用户有效)一般系统安装了编译工具之后无需设置这些变量编译都不会出现问 ...
- 使用c3p0与DBCP连接池,造成的MySql 8小时问题解决方式
本文提供了对c3p0与DBCP连接池连接MySql数据库时. 8小时内无请求自己主动断开连接的解决方式.首先介绍一下我在项目(c3p0连接池)中遇到的问题,后面还提供了使用DBCP连接池的解决方式. ...
- 保护眼睛-eclipse黑色背景设置
eclipse中java编辑器颜色改动,适合程序员人群: 长时间编码,眼睛是有非常大负担的,特别是使用eclipse,它自带的java编辑器背景色是刺眼的白色.代码颜色基本是黑色,这样一个编辑器里白色 ...
- MongoDB改动、删除文档的域属性实例
MongoDB改动.删除文档的域属性实例 在站点的开发中,可能最初的设计不合理.或者后期业务的变更,会造成文档结构会有些无用的属性.须要去删除或改动.因为MongoDB 是无 Schema 的,不像关 ...
- hdu1116 Play on Words--并查集
原题链接: pid=1116">http://acm.hdu.edu.cn/showproblem.php? pid=1116 一:原题内容 Problem Description S ...