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 ...
随机推荐
- C#关键字详解第一节
abstract:抽象类: 他表达对问题或者实际中的事物,对象等所设计出的抽象概念,比如一个灵感.生物等,这些都是抽像, 但是他们往往也有具体的指向,比如生物圈有人类,猴子,老虎等等,老虎和人类是实际 ...
- fastclick:处理移动端click事件300毫秒延迟
fastclick:处理移动端click事件300毫秒延迟 1.兼容性 iOS 3及更高版本的移动Safari iOS 5及更高版本的Chrome Android上的Chrome(ICS) Opera ...
- 该页必须使用安全性较高的Web 浏览器查看
当用https访问某个网站时,IE提醒“该页必须使用安全性较高的Web 浏览器查看” 您要访问的资源使用了128位版本的“安全套接层(SSL)” 安全保护.要查看该资源,您需要使用支持该版本的SSL浏 ...
- 【Codeforces 158B】Taxi
[链接] 我是链接,点我呀:) [题意] 每辆车可以载重4个人. 一共有n个组,每个组分别有s[i]个人. 要求每个组的人都在同一辆车里面. 问最少需要多少辆车 [题解] 将每个组的人数从小到大排序. ...
- N - Corporate Identity
Beside other services, ACM helps companies to clearly state their “corporate identity”, which includ ...
- ListView的基本使用技巧
ListView的基本使用技巧 1.headerView和footerView 2.ViewHolder 3.OnScrollListener 4.单行刷新 5.其它细节 ListView提供head ...
- ios 使用Starscream实现websocket简单例子
调试了半天,出现 websocket is disconnected: Invalid HTTP upgrade 的错误 居然是 URL 地址写错了的原因,端口号之后还有一堆地址没有写上. 另外wss ...
- HDU2037 事件排序问题
题目要求: Problem Description "今年暑假不AC?" "是的." "那你干什么呢?" "看世界杯呀,笨蛋!&q ...
- Spring:验证用户登录
利用 Spring IOC 技术实现用户登录的验证机制,对用户进行登录验证. 首先利用 Spring 的自动装配模式将 User 对象注入到控制器中,然后将用户输入的用户名和密码与系统中限定的合法用户 ...
- C# SuperWebSocket服务端学习(二)
首先需要下载DLL类库 地址详见:http://download.csdn.NET/detail/u011269801/9590935 1,打开VS2012,新建一个控制台应用程序,选择.NET4. ...