日期:2014-05-20  浏览次数:20840 次

解决旧问题就会遭遇新的问题
正如偶的签名档所说:解决了旧问题就会遭遇新问题。

        昨天那个在java中通过jni调用dll中的api的问题(详见http://community.csdn.net/Expert/topic/5459/5459435.xml?temp=.5141107),今天解决了:)

        除了忘了引入一个.lib文件外,另一个原因很诡异:我把c源代码中那些变量的声明统一放到了最前面,然后生成dll时,就不会再出那些莫名其妙的错误了……

        但正如偶得签名档所说,解决了旧问题就会遭遇新问题。昨天的问题解决了,今天便陷入了一个更具体的问题之中。一个同学说,他解决问题之前,会把所有问题列出来,一个一个解决。但是问题的关键是,这些问题,根本就是无法预知的,又如何事先列出……

        唔,终于要说出今天的问题所在了,好好组织一下语言先(ps:表达能力越来越弱了(原本也很弱……)……)

        用到的dll中有5个api。第一个api是初始化一块内存,返回这块内存的大小和首地址指针(char   *类型)。在这个地方,偶可能犯了一个错误。因为一看见(char   *),便以为它是字符串,便把它转化为jstring类型,传回给java。这个jstring在java中被转换为了String类型。(而事实上,将这块内存的数据当作byte[]传回java更加合理?)

        这样做是有危险的,因为这块内存中可能(几乎是必然)包含 '\0 '这样的字符。而 '\0 '这个字符标志着(char   *)字符串的结束。所以传回java的字符串在第一个 '\0 '字符处便被截断了。

        我于是很自然想把 '\0 '这个字符替换成一个不常用的字符 '\f '(打印时的换页字符)。然后再把这个字符串传给java,在java中,再把这个String中所有的 '\f '替换回 '\0 '。

        按理说这样做了应该没有别的问题了(除了一个汉字乱码问题,已解决),但是当我将这个java中的已将所有 '\f '替换回 '\0 '的String打印出来和原来最初第一个api中的(char   *)字符串比较时,发现有几处原来显示为 '   '(可能为 '\0 '也可能为 '   ')字符显示成了 '? '。

        真是莫名其妙……,莫名奇妙……

        怎么解决啊????

        期待各位牛人的出现……



------解决方案--------------------
正如你所说的, 表达越来越不行了

我的理解力也是越来越不行了...
------解决方案--------------------
期待各位牛人的出现……