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 ...
随机推荐
- hdu 5174 Ferries Wheel
摩天轮是一个环,周围围绕着一些缆车.每个缆车按顺序编号为1,2,3...K-1,K1,2,3...K−1,K而且每个缆车也拥有一个唯一的值且保证A[i-1] < A[i] < A[i+1] ...
- 『REM』手机屏幕适配
function adapt(designWidth, rem2px){ var d = window.document.createElement('div'); d.style.width = ' ...
- (38)Spring Boot分布式Session状态保存Redis【从零开始学Spring Boot】
[本文章是否对你有用以及是否有好的建议,请留言] 在使用spring boot做负载均衡的时候,多个app之间的session要保持一致,这样负载到不同的app时候,在一个app登录之后,而访问到另外 ...
- Python 2 声明变量 输入输出 练习
变量: 代指,用于将具体信息对应到一个值,便于反复使用时方便调用.例如 name = ("斯诺登") 变量声明规则:以字母开头的 字母数字下划线的组合.且不能是python代 ...
- ZooKeeper的应用场景(转)
应用场景1 :统一命名服务 分布式应用中,通常需要一套完备的命令机制,既能产生唯一的标识,又方便人识别和记忆. 我们知道,每个ZNode都可以由其路径唯一标识,路径本身也比较简洁直观,另外ZNode上 ...
- php svn仓库提交预处理
需要做的事情 1.检查是否填写注释2.php文件是否有语法错误 pre-commit脚本 hook脚本名称:hooks/pre-commit REPOS="$1" TXN=&quo ...
- ArcEngine控制台应用程序
转自wbaolong原文 ArcEngine控制台应用程序 控制台应用程序相比其他应用程序,更加简单,简化了许多冗余,可以让我们更加关注于本质的东西. 现在让我们看一看ArcGIS Engine的控制 ...
- Android studio第一次使用配置(三)gradle项目构建
1.gradle的概念 2.gradle配置jar包.和libs目录导入jar包的差别 3.签名打包: (1)Studio (2)命令行 (3)gradle wrapper的原理 4.BuildCon ...
- 大规模的I/O流中有效识别大数据并增强时间局部性
一篇热数据识别存储外文翻译,本文主要在讲思想 原文题目: HDCat: Effectively Identifying Hot Data in Large-scale I/O Streams ...
- @RestController注解的使用
示例代码:/*@ResponseBody@Controller*/@RestControllerpublic class HelloController { @RequestMapping(" ...