在开发Android项目时,我对Java在执行文件操作方面的速度有点沮丧。一个或两个文件很好,但一次读取几个100个文件需要很长时间。所以我决定尝试使用JNI / C ++,并花了一天时间阅读语言,并在NDK设置,JNI等上花了一天时间。
起初一切正常。我创建了我需要的C ++部分,它显着减少了读取文件的时间。与此同时,我终于找到了学习C ++的借口,C ++已经在我的待办事项上工作了很长时间。
但是当我开始在其他设备上测试时,我遇到了一些问题,这些问题是由于某些设备上缺少适当的C ++库造成的。所以我改变了我的配置来代替静态构建。但由于某种原因,c ++ _ static不会构建。它接缝是一个常见的问题,所以我转而使用gnustl_static代替。它工作,直到我在最后一个设备上进行了最后一次测试,它使用NewStringUTF在UTF错误中崩溃。我四处搜索并找到了关于切换到stlport_static的建议。这确实解决了崩溃问题,但仍然存在问题。我联系了一些设备上的一些输出。
我将此问题发送到我的'Set'容器。没有我尝试添加的东西,它在某些设备上保持空置,而在其他设备上工作正常。如果我切换到'Vector'容器,它在所有设备上都能正常工作。
我的问题是,Android的NDK工具接缝非常不稳定。我有5个不同版本的Android测试设备,甚至在C ++中使用静态构建库,它们在每个版本上的运行方式都不同。即使我在所有5个设备上都能使用它,我怎么能确定第6个设备上的问题不会出现我无法测试?我知道很多应用程序都是用附加的C / C ++库构建的,这些应用程序通常是NDK工具的宽度,还是人们使用第3方编译器来创建这些?我需要做一些比这更稳定的设置,但不确定如何。我一直在使用C ++和JNI大约3天,所以我在这方面的经验不是很大。
我的Android / Eclipse设置旁边有一个Code :: Block环境,我在阅读C ++时用它来创建一些测试代码。在我的常规Linux桌面上使用它非常有效。但这可以设置为与Android的JNI一起使用吗?
修改
IT部门认为我的大多数最新问题都是由字符编码问题引起的。根据Android版本,它的处理方式不同。
例如,我将一个String数组解析为C ++,并将数据提取到'Set'容器中的std :: string变量。出于某种原因,我无法将其与从一堆文件中提取的某些值进行比较。它适用于某些设备(KitKat和Lollipop),但不适用于第三种设备(Jelly Bean 4.1)。所以我尝试调试它,首先将文件值解析回Java,然后将它们打印到屏幕上。这导致错误 '非法延续字节0x70' ,同时将其转换为Java字符串。
在Android开发者页面上,声明:
除非您知道数据是7位ASCII,否则您需要去掉 高位ASCII字符或将它们转换为适当的修改后的UTF-8表格
但我不知道如何做到这一点。
我尝试从文件中打印内容,然后从Java中解析我的解析数据。问题是解析的数据。将值添加到 std :: string 时, GetStringUTFChars 会返回C ++无法正确读取的内容变量。还有一些无法使用 NewStringUTF 转换回java的内容。