C++转JAVA的转换方法及约定

news/2024/7/4 1:31:21 标签: java, c++, jni, c, class
class="tags" href="/tags/C.html" title=c>cle class="tags" href="/tags/C.html" title=c>class="baidu_pl">
class="tags" href="/tags/C.html" title=c>cle_class="tags" href="/tags/C.html" title=c>content" class="tags" href="/tags/C.html" title=c>class="articlass="tags" href="/tags/C.html" title=c>cle_class="tags" href="/tags/C.html" title=c>content class="tags" href="/tags/C.html" title=c>clearfix">
class="tags" href="/tags/C.html" title=c>content_views" class="tags" href="/tags/C.html" title=c>class="htmledit_views">

1.基本思想:

1.1 使对象对应

每出现一个C++类就写一个JAVA类, JAVA类的行为完全模仿C++类的行为. 而且要保证C++的对象的生存期至少比JAVA长, 而且能够保证使所有动态分配出来的C++对象有机会得到析构。

 

实现的方法是在每个JAVA类中添加一个int 类型的变量 ptr(参见表2.1中的part4)࿰class="tags" href="/tags/C.html" title=c>c;ptr指向该JAVA类所对应的C++对象。ptr并不在JAVA中使用࿰class="tags" href="/tags/C.html" title=c>c;它只在本地方法中通过转换成相应的C++对象࿰class="tags" href="/tags/C.html" title=c>c;来实现对C++调用(请参考表3.1 示例)。

 

1.2 关于C++对象和JAVA对象的生存期问题的解决:

对于C++对象的生成有两种情况

1.2.1第一种情况࿰class="tags" href="/tags/C.html" title=c>c;新的C++对象在原C++系统内部管理࿰class="tags" href="/tags/C.html" title=c>c;在JAVA中我们不关心它的创建和释放

C++对象是由原系统(C++)内部生成࿰class="tags" href="/tags/C.html" title=c>c;然后返回给外部调用最后再由原C++系统释放。在这种情况下࿰class="tags" href="/tags/C.html" title=c>c;我们新建一个对应的JAVA类࿰class="tags" href="/tags/C.html" title=c>c;然后把这个C++对象的地址赋给该JAVA类的内部成员变量ptr(通过带有参数(FromReturn ,int exestPtr)的构造函数实现࿰class="tags" href="/tags/C.html" title=c>c;其中FromReturn是一个空类用于标注不要创建C++对象࿰class="tags" href="/tags/C.html" title=c>c;参见表2.1)。

class="tags" href="/tags/C.html" title=c>color:red">按目前的分析࿰class="tags" href="/tags/C.html" title=c>c;这种情况仅限于在原系统中返回值是class="tags" href="/tags/C.html" title=c>color:red">C++class="tags" href="/tags/C.html" title=c>color:red">指针的情况

1.2.2第二种情况࿰class="tags" href="/tags/C.html" title=c>c;新的C++对象在外部创建

是除第一种情况之外的(动态创建和静态创建都包括)其它所有情况

(1)若原C++类提供了构造函数࿰class="tags" href="/tags/C.html" title=c>c;则在相应的JAVA类中效仿C++中的构造函数将它改造成JAVA格式。然后在此JAVA构造函数中调用Part3中的服务接口函数࿰class="tags" href="/tags/C.html" title=c>c;该服务接口函数(JNI)在相应的本地方法中创建新的C++对象(并将它放进全局的对象管理类, 见本条末)。 在finallize的接口服务函数(JNI)的本地方法中释放这个C++对象࿰class="tags" href="/tags/C.html" title=c>c;但是JAVA并不保证finallize一定执行࿰class="tags" href="/tags/C.html" title=c>c;我们通过在JNI的本地实现中声明一个全局的对象管理类来解决࿰class="tags" href="/tags/C.html" title=c>c;当新分配一个C++对象时我们把它放进这个管理类࿰class="tags" href="/tags/C.html" title=c>c;当finallize 执行时我们告诉这个管理类让它释放掉这个类。最后我们在这个管理类的析构函数中释放掉所有未能被释放的C++对象。(该类参见表2.2CObjeclass="tags" href="/tags/C.html" title=c>ctManager类)

(2)若原C++类提没有供了构造函数则我们在JAVA端提供一个空参数的构造函数(示例3.1中的JA)࿰class="tags" href="/tags/C.html" title=c>c;其余同(1)

注:每个JAVA类都有4个部分Part1, Part2, P art3, Part4

1.3 关于关于多态问题的解决:

当C++中的函数返回类型为基类类型的指针而实际返回的是C++子类的对象时࿰class="tags" href="/tags/C.html" title=c>c;相应的转到JAVA后也要返回的是JAVA基类类型但是要返回实际的JAVA子类对象࿰class="tags" href="/tags/C.html" title=c>c;这时需要在C++端的基类中提供一个GetType函数在JAVA端根据不同的类型返回不同的JAVA子对象

 

2.约定

2.1类名

class="tags" href="/tags/C.html" title=c>color:red">JAVAclass="tags" href="/tags/C.html" title=c>color:red">系统内类名与class="tags" href="/tags/C.html" title=c>color:red">C++class="tags" href="/tags/C.html" title=c>color:red">类的类名一致࿰class="tags" href="/tags/C.html" title=c>c;方法格式一致

2.2关于类的创建:

参见1.2

2.3每个JAVA类都有四个部分.如表2.1所示。(此处以类JA为例)

其中用到一个全局的类

publiclass="tags" href="/tags/C.html" title=c>c class="tags" href="/tags/C.html" title=c>class FromReturn(){}

是一个空类࿰class="tags" href="/tags/C.html" title=c>c;用在传给JAVA类的构造函数的参数࿰class="tags" href="/tags/C.html" title=c>c;用于标注不要在构造函数中创建C++对象。这种情况适用于在原C++系统中返回一个类的情况。

 


class="tags" href="/tags/C.html" title=c>center"> 

class="tags" href="/tags/C.html" title=c>cellspaclass="tags" href="/tags/C.html" title=c>cing="0" class="tags" href="/tags/C.html" title=c>cellpadding="0" align="left" width="691">

class="tags" href="/tags/C.html" title=c>center">表2.1对JAVA类的约定

class="tags" href="/tags/C.html" title=c>center">对JAVA类的约定(以类JA为例)࿰class="tags" href="/tags/C.html" title=c>c;共分四个部分class="tags" href="/tags/C.html" title=c>color:#A50021">Parts1class="tags" href="/tags/C.html" title=c>color:#A50021">和class="tags" href="/tags/C.html" title=c>color:#A50021"> Part2class="tags" href="/tags/C.html" title=c>color:#A50021">中的方法除class="tags" href="/tags/C.html" title=c>color:#A50021"> JA(FromReturn ,int exestPtr)class="tags" href="/tags/C.html" title=c>color:#A50021">这个构造函数外࿰class="tags" href="/tags/C.html" title=c>c;其余的函数都要在class="tags" href="/tags/C.html" title=c>color:#A50021">Part3class="tags" href="/tags/C.html" title=c>color:#A50021">中的函数来实现࿰class="tags" href="/tags/C.html" title=c>c;即class="tags" href="/tags/C.html" title=c>color:#A50021">Par3class="tags" href="/tags/C.html" title=c>color:#A50021">为class="tags" href="/tags/C.html" title=c>color:#A50021">Part1class="tags" href="/tags/C.html" title=c>color:#A50021">和class="tags" href="/tags/C.html" title=c>color:#A50021">Part2class="tags" href="/tags/C.html" title=c>color:#A50021">提供服务࿰class="tags" href="/tags/C.html" title=c>c;而Part3通过JNI调用本地方法

publiclass="tags" href="/tags/C.html" title=c>c class="tags" href="/tags/C.html" title=c>class JA {

class="tags" href="/tags/C.html" title=c>color:#009600; baclass="tags" href="/tags/C.html" title=c>ckground:#D9D9D9">//Part 1 class="tags" href="/tags/C.html" title=c>construclass="tags" href="/tags/C.html" title=c>ctclass="tags" href="/tags/C.html" title=c>color:#009600; baclass="tags" href="/tags/C.html" title=c>ckground:#D9D9D9">与class="tags" href="/tags/C.html" title=c>color:#009600; baclass="tags" href="/tags/C.html" title=c>ckground:#D9D9D9">finallize,class="tags" href="/tags/C.html" title=c>color:#009600; baclass="tags" href="/tags/C.html" title=c>ckground:#D9D9D9">必须提供class="tags" href="/tags/C.html" title=c>color:#009600; baclass="tags" href="/tags/C.html" title=c>ckground:#D9D9D9">=================================================

        proteclass="tags" href="/tags/C.html" title=c>cted  JA(FromReturn ,int exestPtr){class="tags" href="/tags/C.html" title=c>color:#009600">//class="tags" href="/tags/C.html" title=c>color:#A50021">所有的类必须提class="tags" href="/tags/C.html" title=c>color:#009600">供这个构造方法࿰class="tags" href="/tags/C.html" title=c>c;除了类名不一样外其余部分完

              ptr =existPtr;                       class="tags" href="/tags/C.html" title=c>color:#009600"> //class="tags" href="/tags/C.html" title=c>color:#009600">全一样这个构造函数并不需要class="tags" href="/tags/C.html" title=c>color:#009600">JNIclass="tags" href="/tags/C.html" title=c>color:#009600">࿰class="tags" href="/tags/C.html" title=c>c;仅供内部使用࿰class="tags" href="/tags/C.html" title=c>c;除这个构造函数外其

              class="tags" href="/tags/C.html" title=c>color:#0000C0">isFromReturn=true;      class="tags" href="/tags/C.html" title=c>color:#009600"> //class="tags" href="/tags/C.html" title=c>color:#009600">它在本部分的方法都需要class="tags" href="/tags/C.html" title=c>color:#009600">JNIclass="tags" href="/tags/C.html" title=c>color:#009600">࿰class="tags" href="/tags/C.html" title=c>c;该方法内容十分固定࿰class="tags" href="/tags/C.html" title=c>c;所有类必须遵守

       }                                              

 

       publiclass="tags" href="/tags/C.html" title=c>c JA(){ptr=nJA();class="tags" href="/tags/C.html" title=c>color:#0000C0"> isFromReturn =false;}//

        publiclass="tags" href="/tags/C.html" title=c>c class="tags" href="/tags/C.html" title=c>color:#7F0055"> synclass="tags" href="/tags/C.html" title=c>chronized  finalize(){if(!class="tags" href="/tags/C.html" title=c>color:#0000C0"> isFromReturn )nfinallize(ptr);}

class="tags" href="/tags/C.html" title=c>color:#009600; baclass="tags" href="/tags/C.html" title=c>ckground:#D9D9D9">//Part 2class="tags" href="/tags/C.html" title=c>color:#009600; baclass="tags" href="/tags/C.html" title=c>ckground:#D9D9D9">必须提供࿰class="tags" href="/tags/C.html" title=c>c;与class="tags" href="/tags/C.html" title=c>color:#009600; baclass="tags" href="/tags/C.html" title=c>ckground:#D9D9D9">class="tags" href="/tags/C.html" title=c>c++class="tags" href="/tags/C.html" title=c>color:#009600; baclass="tags" href="/tags/C.html" title=c>ckground:#D9D9D9">中暴露的方法一至࿰class="tags" href="/tags/C.html" title=c>c;但要对应到class="tags" href="/tags/C.html" title=c>color:#009600; baclass="tags" href="/tags/C.html" title=c>ckground:#D9D9D9">JAVAclass="tags" href="/tags/C.html" title=c>color:#009600; baclass="tags" href="/tags/C.html" title=c>ckground:#D9D9D9">格式class="tags" href="/tags/C.html" title=c>color:#009600; baclass="tags" href="/tags/C.html" title=c>ckground:#D9D9D9">========================

       publiclass="tags" href="/tags/C.html" title=c>c SomeClass SomeMethod(){class="tags" href="/tags/C.html" title=c>color:#009600">//class="tags" href="/tags/C.html" title=c>color:#009600">有返回࿰class="tags" href="/tags/C.html" title=c>c;对象类型

               int ptrB;

ptrB = nSomeMethod (ptr);

SomeClass b=SomeClass (new FromReturn(), ptrB);

Return b;

       }

 

       publiclass="tags" href="/tags/C.html" title=c>c int SomeMethod2(){return  nSomeMethod2( ptr);  }class="tags" href="/tags/C.html" title=c>color:#009600">//class="tags" href="/tags/C.html" title=c>color:#009600">有返回࿰class="tags" href="/tags/C.html" title=c>c;基本类型(以class="tags" href="/tags/C.html" title=c>color:#009600">intclass="tags" href="/tags/C.html" title=c>color:#009600">为例)

       publiclass="tags" href="/tags/C.html" title=c>c void SomeMethod3(){ nSomeMethod3( ptr); }class="tags" href="/tags/C.html" title=c>color:#009600">//class="tags" href="/tags/C.html" title=c>color:#009600">无返回

class="tags" href="/tags/C.html" title=c>color:#009600">       //class="tags" href="/tags/C.html" title=c>color:#009600">以上几个示例函数只是针对在原class="tags" href="/tags/C.html" title=c>color:#009600">C++class="tags" href="/tags/C.html" title=c>color:#009600">系统中没有传入参数的情况࿰class="tags" href="/tags/C.html" title=c>c;对于在原class="tags" href="/tags/C.html" title=c>color:#009600">C++class="tags" href="/tags/C.html" title=c>color:#009600">系统中有传入参数的情

class="tags" href="/tags/C.html" title=c>color:#009600">       //class="tags" href="/tags/C.html" title=c>color:#009600">况class="tags" href="/tags/C.html" title=c>color:#009600">,class="tags" href="/tags/C.html" title=c>color:#009600">根据class="tags" href="/tags/C.html" title=c>color:#009600">JNIclass="tags" href="/tags/C.html" title=c>color:#009600">的特性直接传即可。只是对在原class="tags" href="/tags/C.html" title=c>color:#009600">C++class="tags" href="/tags/C.html" title=c>color:#009600">系统中传入的参数是基本类型的引用或是基本类型的指针class="tags" href="/tags/C.html" title=c>color:#009600">      //class="tags" href="/tags/C.html" title=c>color:#009600">指针的情况有所不同(因为这些参数有可能被改变)࿰class="tags" href="/tags/C.html" title=c>c;解决的办法是将每个参数放进容量等于class="tags" href="/tags/C.html" title=c>color:#009600">1class="tags" href="/tags/C.html" title=c>color:#009600">的数组里class="tags" href="/tags/C.html" title=c>color:#009600">       //class="tags" href="/tags/C.html" title=c>color:#009600">再传

class="tags" href="/tags/C.html" title=c>color:#009600; baclass="tags" href="/tags/C.html" title=c>ckground:#D9D9D9">//Part 3class="tags" href="/tags/C.html" title=c>color:#009600; baclass="tags" href="/tags/C.html" title=c>ckground:#D9D9D9">访问权限一至class="tags" href="/tags/C.html" title=c>color:#009600; baclass="tags" href="/tags/C.html" title=c>ckground:#D9D9D9">proteclass="tags" href="/tags/C.html" title=c>cted nativeclass="tags" href="/tags/C.html" title=c>color:#009600; baclass="tags" href="/tags/C.html" title=c>ckground:#D9D9D9">提供本类供class="tags" href="/tags/C.html" title=c>color:#009600; baclass="tags" href="/tags/C.html" title=c>ckground:#D9D9D9">part1class="tags" href="/tags/C.html" title=c>color:#009600; baclass="tags" href="/tags/C.html" title=c>ckground:#D9D9D9">和class="tags" href="/tags/C.html" title=c>color:#009600; baclass="tags" href="/tags/C.html" title=c>ckground:#D9D9D9">part2class="tags" href="/tags/C.html" title=c>color:#009600; baclass="tags" href="/tags/C.html" title=c>ckground:#D9D9D9">中方法调用的本地代码的声明class="tags" href="/tags/C.html" title=c>color:#A50021; baclass="tags" href="/tags/C.html" title=c>ckground:#D9D9D9">注意本部分不对class="tags" href="/tags/C.html" title=c>color:#A50021; baclass="tags" href="/tags/C.html" title=c>ckground:#D9D9D9">//class="tags" href="/tags/C.html" title=c>color:#A50021; baclass="tags" href="/tags/C.html" title=c>ckground:#D9D9D9">外暴露任何东西࿰class="tags" href="/tags/C.html" title=c>c;命名的方法是在class="tags" href="/tags/C.html" title=c>color:#A50021; baclass="tags" href="/tags/C.html" title=c>ckground:#D9D9D9"> part1class="tags" href="/tags/C.html" title=c>color:#A50021; baclass="tags" href="/tags/C.html" title=c>ckground:#D9D9D9">和class="tags" href="/tags/C.html" title=c>color:#A50021; baclass="tags" href="/tags/C.html" title=c>ckground:#D9D9D9">part2class="tags" href="/tags/C.html" title=c>color:#A50021; baclass="tags" href="/tags/C.html" title=c>ckground:#D9D9D9">暴露方法的的名字前加一个class="tags" href="/tags/C.html" title=c>color:#A50021; baclass="tags" href="/tags/C.html" title=c>ckground:#D9D9D9">nclass="tags" href="/tags/C.html" title=c>color:#A50021; baclass="tags" href="/tags/C.html" title=c>ckground:#D9D9D9">࿰class="tags" href="/tags/C.html" title=c>c;当返回的是对象或结构时࿰class="tags" href="/tags/C.html" title=c>c;class="tags" href="/tags/C.html" title=c>color:#A50021; baclass="tags" href="/tags/C.html" title=c>ckground:#D9D9D9">//class="tags" href="/tags/C.html" title=c>color:#A50021; baclass="tags" href="/tags/C.html" title=c>ckground:#D9D9D9">要返回它的在class="tags" href="/tags/C.html" title=c>color:#A50021; baclass="tags" href="/tags/C.html" title=c>ckground:#D9D9D9">C++class="tags" href="/tags/C.html" title=c>color:#A50021; baclass="tags" href="/tags/C.html" title=c>ckground:#D9D9D9">中的指针࿰class="tags" href="/tags/C.html" title=c>c;在class="tags" href="/tags/C.html" title=c>color:#A50021; baclass="tags" href="/tags/C.html" title=c>ckground:#D9D9D9">JAVAclass="tags" href="/tags/C.html" title=c>color:#A50021; baclass="tags" href="/tags/C.html" title=c>ckground:#D9D9D9">端用class="tags" href="/tags/C.html" title=c>color:#A50021; baclass="tags" href="/tags/C.html" title=c>ckground:#D9D9D9">intclass="tags" href="/tags/C.html" title=c>color:#A50021; baclass="tags" href="/tags/C.html" title=c>ckground:#D9D9D9">表示。每个方法声明的第一个参数都是一至的࿰class="tags" href="/tags/C.html" title=c>c;都本类的class="tags" href="/tags/C.html" title=c>color:#A50021; baclass="tags" href="/tags/C.html" title=c>ckground:#D9D9D9">prtclass="tags" href="/tags/C.html" title=c>color:#A50021; baclass="tags" href="/tags/C.html" title=c>ckground:#D9D9D9">属性(服务于构造函数的class="tags" href="/tags/C.html" title=c>color:#A50021; baclass="tags" href="/tags/C.html" title=c>ckground:#D9D9D9">JNIclass="tags" href="/tags/C.html" title=c>color:#A50021; baclass="tags" href="/tags/C.html" title=c>ckground:#D9D9D9">声明除外——在本地端动态获得这个class="tags" href="/tags/C.html" title=c>color:#A50021; baclass="tags" href="/tags/C.html" title=c>ckground:#D9D9D9">ptrclass="tags" href="/tags/C.html" title=c>color:#A50021; baclass="tags" href="/tags/C.html" title=c>ckground:#D9D9D9">࿰class="tags" href="/tags/C.html" title=c>c;并把新分配的class="tags" href="/tags/C.html" title=c>color:#A50021; baclass="tags" href="/tags/C.html" title=c>ckground:#D9D9D9">C++class="tags" href="/tags/C.html" title=c>color:#A50021; baclass="tags" href="/tags/C.html" title=c>ckground:#D9D9D9">对象指针赋于它)

class="tags" href="/tags/C.html" title=c>color:#009600; baclass="tags" href="/tags/C.html" title=c>ckground:#D9D9D9">//===========================================================================

       class="tags" href="/tags/C.html" title=c>color:#009600">//class="tags" href="/tags/C.html" title=c>color:#009600">针对class="tags" href="/tags/C.html" title=c>color:#009600">part1

       private native int nJA();class="tags" href="/tags/C.html" title=c>color:#A50021">//class="tags" href="/tags/C.html" title=c>color:#A50021">注:这里没有传入class="tags" href="/tags/C.html" title=c>color:#A50021">ptr,class="tags" href="/tags/C.html" title=c>color:#A50021">返回的值被赋给class="tags" href="/tags/C.html" title=c>color:#A50021">ptrclass="tags" href="/tags/C.html" title=c>color:#A50021">。在本地class="tags" href="/tags/C.html" title=c>color:#A50021">C++class="tags" href="/tags/C.html" title=c>color:#A50021">端class="tags" href="/tags/C.html" title=c>color:#A50021">nJA newclass="tags" href="/tags/C.html" title=c>color:#A50021">一个新的class="tags" href="/tags/C.html" title=c>color:#A50021">C++                            //class="tags" href="/tags/C.html" title=c>color:#A50021">对象class="tags" href="/tags/C.html" title=c>color:#A50021">,class="tags" href="/tags/C.html" title=c>color:#A50021">并将其指针放入class="tags" href="/tags/C.html" title=c>color:#A50021">CObjeclass="tags" href="/tags/C.html" title=c>ctManagerclass="tags" href="/tags/C.html" title=c>color:#A50021">中

       private native void nfinallize(int ptr);

class="tags" href="/tags/C.html" title=c>color:#009600">       //class="tags" href="/tags/C.html" title=c>color:#009600">针对class="tags" href="/tags/C.html" title=c>color:#009600"> part2 ,class="tags" href="/tags/C.html" title=c>color:#009600">在class="tags" href="/tags/C.html" title=c>color:#009600">part2class="tags" href="/tags/C.html" title=c>color:#009600">中有什么样的函数这里就有相对应的服务函数声明

       private native int           nSomeMethod (int ptr );class="tags" href="/tags/C.html" title=c>color:#009600">//class="tags" href="/tags/C.html" title=c>color:#009600">有返回࿰class="tags" href="/tags/C.html" title=c>c;对象类型

       private native int           nSomeMethod2 (int ptr );class="tags" href="/tags/C.html" title=c>color:#009600">//class="tags" href="/tags/C.html" title=c>color:#009600">有返回࿰class="tags" href="/tags/C.html" title=c>c;基本类型(以class="tags" href="/tags/C.html" title=c>color:#009600">intclass="tags" href="/tags/C.html" title=c>color:#009600">为例)

       private native void         nSomeMethod3 (int ptr );class="tags" href="/tags/C.html" title=c>color:#009600">//class="tags" href="/tags/C.html" title=c>color:#009600">无返回

class="tags" href="/tags/C.html" title=c>color:#009600; baclass="tags" href="/tags/C.html" title=c>ckground:#D9D9D9">//Part 4 =================================================

class="tags" href="/tags/C.html" title=c>color:blaclass="tags" href="/tags/C.html" title=c>ck">    class="tags" href="/tags/C.html" title=c>color:#7F0055">publiclass="tags" href="/tags/C.html" title=c>cclass="tags" href="/tags/C.html" title=c>color:#7F0055">intclass="tags" href="/tags/C.html" title=c>color:#0000C0">ptrclass="tags" href="/tags/C.html" title=c>color:blaclass="tags" href="/tags/C.html" title=c>ck">;//class="tags" href="/tags/C.html" title=c>color:#009600; baclass="tags" href="/tags/C.html" title=c>ckground:#D9D9D9">指向对应的class="tags" href="/tags/C.html" title=c>color:#009600; baclass="tags" href="/tags/C.html" title=c>ckground:#D9D9D9">C++class="tags" href="/tags/C.html" title=c>color:#009600; baclass="tags" href="/tags/C.html" title=c>ckground:#D9D9D9">对象的指针

class="tags" href="/tags/C.html" title=c>color:blaclass="tags" href="/tags/C.html" title=c>ck">    class="tags" href="/tags/C.html" title=c>color:#7F0055">privateclass="tags" href="/tags/C.html" title=c>color:#7F0055">booleanclass="tags" href="/tags/C.html" title=c>color:#0000C0">isFromReturnclass="tags" href="/tags/C.html" title=c>color:blaclass="tags" href="/tags/C.html" title=c>ck">;//class="tags" href="/tags/C.html" title=c>color:blaclass="tags" href="/tags/C.html" title=c>ck">参见第class="tags" href="/tags/C.html" title=c>color:blaclass="tags" href="/tags/C.html" title=c>ck">4class="tags" href="/tags/C.html" title=c>color:blaclass="tags" href="/tags/C.html" title=c>ck">部分修改说明

 

}

 表2.2本地全局管理类CObjeclass="tags" href="/tags/C.html" title=c>ctManager

class="tags" href="/tags/C.html" title=c>center">

 

class="tags" href="/tags/C.html" title=c>cellspaclass="tags" href="/tags/C.html" title=c>cing="0" class="tags" href="/tags/C.html" title=c>cellpadding="0" align="left" width="679">

class="tags" href="/tags/C.html" title=c>center">CObjeclass="tags" href="/tags/C.html" title=c>ctManager

class="tags" href="/tags/C.html" title=c>center">class="tags" href="/tags/C.html" title=c>color:#ff0000">//注:在真实环境下使用时࿰class="tags" href="/tags/C.html" title=c>c;Add方法要包含类的信息࿰class="tags" href="/tags/C.html" title=c>c;在析构时也要根据类的信息把VOID*类型强制转换成目标类型后再析构

class="tags" href="/tags/C.html" title=c>class  CObjeclass="tags" href="/tags/C.html" title=c>ctManager{

publiclass="tags" href="/tags/C.html" title=c>c:

       Add(void * class="tags" href="/tags/C.html" title=c>cppObj);class="tags" href="/tags/C.html" title=c>color:#009600">//class="tags" href="/tags/C.html" title=c>color:#009600">添加类地址到class="tags" href="/tags/C.html" title=c>color:#009600">objsclass="tags" href="/tags/C.html" title=c>color:#009600">中

       Remove(void* class="tags" href="/tags/C.html" title=c>cppObj);class="tags" href="/tags/C.html" title=c>color:#009600">//class="tags" href="/tags/C.html" title=c>color:#009600">释放class="tags" href="/tags/C.html" title=c>color:#009600">class="tags" href="/tags/C.html" title=c>cppObjclass="tags" href="/tags/C.html" title=c>color:#009600">对象࿰class="tags" href="/tags/C.html" title=c>c;并将其在class="tags" href="/tags/C.html" title=c>color:#009600">objsclass="tags" href="/tags/C.html" title=c>color:#009600">中移除

       CObjeclass="tags" href="/tags/C.html" title=c>ctManager();class="tags" href="/tags/C.html" title=c>color:#009600">//class="tags" href="/tags/C.html" title=c>color:#009600">构造函数࿰class="tags" href="/tags/C.html" title=c>c;初始化class="tags" href="/tags/C.html" title=c>color:#009600">objs

       ~ CObjeclass="tags" href="/tags/C.html" title=c>ctManager();class="tags" href="/tags/C.html" title=c>color:#009600">//class="tags" href="/tags/C.html" title=c>color:#009600">析构函数࿰class="tags" href="/tags/C.html" title=c>c;若class="tags" href="/tags/C.html" title=c>color:#009600">objsclass="tags" href="/tags/C.html" title=c>color:#009600">不空࿰class="tags" href="/tags/C.html" title=c>c;则释放class="tags" href="/tags/C.html" title=c>color:#009600">objsclass="tags" href="/tags/C.html" title=c>color:#009600">中的所有对象࿰class="tags" href="/tags/C.html" title=c>c;并将class="tags" href="/tags/C.html" title=c>color:#009600">objsclass="tags" href="/tags/C.html" title=c>color:#009600">清空

private:

       map<int , void*>objs;class="tags" href="/tags/C.html" title=c>color:#009600">//class="tags" href="/tags/C.html" title=c>color:#009600">键和值为同一值

}

 







3 示例


 

class="tags" href="/tags/C.html" title=c>center">表3.1. 示例

class="tags" href="/tags/C.html" title=c>cellspaclass="tags" href="/tags/C.html" title=c>cing="0" class="tags" href="/tags/C.html" title=c>cellpadding="0" width="684">
class="tags" href="/tags/C.html" title=c>colspan="2">

class="tags" href="/tags/C.html" title=c>center">JAVA

class="tags" href="/tags/C.html" title=c>colspan="3">

class="tags" href="/tags/C.html" title=c>center">JNI

class="tags" href="/tags/C.html" title=c>center">C++

class="tags" href="/tags/C.html" title=c>colspan="2">

publiclass="tags" href="/tags/C.html" title=c>c class="tags" href="/tags/C.html" title=c>class JA {

class="tags" href="/tags/C.html" title=c>color:#009600; baclass="tags" href="/tags/C.html" title=c>ckground:#D9D9D9">//Part 1 class="tags" href="/tags/C.html" title=c>construclass="tags" href="/tags/C.html" title=c>ctclass="tags" href="/tags/C.html" title=c>color:#009600; baclass="tags" href="/tags/C.html" title=c>ckground:#D9D9D9">与class="tags" href="/tags/C.html" title=c>color:#009600; baclass="tags" href="/tags/C.html" title=c>ckground:#D9D9D9">finallize

       proteclass="tags" href="/tags/C.html" title=c>cted JA(FromReturn,int exestPtr){

              ptr =existPtr;

              class="tags" href="/tags/C.html" title=c>color:#0000C0">isFromReturn=trueclass="tags" href="/tags/C.html" title=c>color:blaclass="tags" href="/tags/C.html" title=c>ck">;

       }

       publiclass="tags" href="/tags/C.html" title=c>c JA(){

              ptr=nJA();

              class="tags" href="/tags/C.html" title=c>color:#0000C0">isFromReturn=falseclass="tags" href="/tags/C.html" title=c>color:blaclass="tags" href="/tags/C.html" title=c>ck">;

       }//

       Publiclass="tags" href="/tags/C.html" title=c>c class="tags" href="/tags/C.html" title=c>color:#7F0055">synclass="tags" href="/tags/C.html" title=c>chronized finalize()

       {if(!class="tags" href="/tags/C.html" title=c>color:#0000C0">isFromReturn)nfinallize(ptr);}

class="tags" href="/tags/C.html" title=c>color:#009600; baclass="tags" href="/tags/C.html" title=c>ckground:#D9D9D9">//Part 2 class="tags" href="/tags/C.html" title=c>color:#009600; baclass="tags" href="/tags/C.html" title=c>ckground:#D9D9D9">必须提供࿰class="tags" href="/tags/C.html" title=c>c;与class="tags" href="/tags/C.html" title=c>color:#009600; baclass="tags" href="/tags/C.html" title=c>ckground:#D9D9D9">class="tags" href="/tags/C.html" title=c>c++class="tags" href="/tags/C.html" title=c>color:#009600; baclass="tags" href="/tags/C.html" title=c>ckground:#D9D9D9">中暴露的方法一至࿰class="tags" href="/tags/C.html" title=c>c;但要对应到class="tags" href="/tags/C.html" title=c>color:#009600; baclass="tags" href="/tags/C.html" title=c>ckground:#D9D9D9">JAVAclass="tags" href="/tags/C.html" title=c>color:#009600; baclass="tags" href="/tags/C.html" title=c>ckground:#D9D9D9">格式

       publiclass="tags" href="/tags/C.html" title=c>c JB GetB(){

             

              int ptrB;

              ptrB=nGetB(ptr);

              JB b=new JB(new FromReturn(),ptrB);

              return b;

       }

class="tags" href="/tags/C.html" title=c>color:#009600; baclass="tags" href="/tags/C.html" title=c>ckground:#D9D9D9">//Part 3class="tags" href="/tags/C.html" title=c>color:#009600; baclass="tags" href="/tags/C.html" title=c>ckground:#D9D9D9">访问权限一至class="tags" href="/tags/C.html" title=c>color:#009600; baclass="tags" href="/tags/C.html" title=c>ckground:#D9D9D9">proteclass="tags" href="/tags/C.html" title=c>cted native

class="tags" href="/tags/C.html" title=c>color:#009600; baclass="tags" href="/tags/C.html" title=c>ckground:#D9D9D9">提供本类供class="tags" href="/tags/C.html" title=c>color:#009600; baclass="tags" href="/tags/C.html" title=c>ckground:#D9D9D9">part1class="tags" href="/tags/C.html" title=c>color:#009600; baclass="tags" href="/tags/C.html" title=c>ckground:#D9D9D9">和class="tags" href="/tags/C.html" title=c>color:#009600; baclass="tags" href="/tags/C.html" title=c>ckground:#D9D9D9">part2class="tags" href="/tags/C.html" title=c>color:#009600; baclass="tags" href="/tags/C.html" title=c>ckground:#D9D9D9">中方法调用的class="tags" href="/tags/C.html" title=c>color:#009600; baclass="tags" href="/tags/C.html" title=c>ckground:#D9D9D9">JNIclass="tags" href="/tags/C.html" title=c>color:#009600; baclass="tags" href="/tags/C.html" title=c>ckground:#D9D9D9">的声明注意本部分不对外暴露任何东西

       class="tags" href="/tags/C.html" title=c>color:#009600">//class="tags" href="/tags/C.html" title=c>color:#009600">针对class="tags" href="/tags/C.html" title=c>color:#009600">part1

       private native int  nJA();

       private native void nfinallize(int ptr);

class="tags" href="/tags/C.html" title=c>color:#009600">       //class="tags" href="/tags/C.html" title=c>color:#009600">针对class="tags" href="/tags/C.html" title=c>color:#009600"> part2

       private native int nGetB(ptr);

class="tags" href="/tags/C.html" title=c>color:#009600; baclass="tags" href="/tags/C.html" title=c>ckground:#D9D9D9">//Part 4 class="tags" href="/tags/C.html" title=c>color:#009600; baclass="tags" href="/tags/C.html" title=c>ckground:#D9D9D9">指向对应的class="tags" href="/tags/C.html" title=c>color:#009600; baclass="tags" href="/tags/C.html" title=c>ckground:#D9D9D9">C++class="tags" href="/tags/C.html" title=c>color:#009600; baclass="tags" href="/tags/C.html" title=c>ckground:#D9D9D9">对象的指针

       proteclass="tags" href="/tags/C.html" title=c>cted int   ptr;

       class="tags" href="/tags/C.html" title=c>color:#7F0055">privateclass="tags" href="/tags/C.html" title=c>color:#7F0055">booleanclass="tags" href="/tags/C.html" title=c>color:#0000C0">isFromReturnclass="tags" href="/tags/C.html" title=c>color:blaclass="tags" href="/tags/C.html" title=c>ck">;

}

class="tags" href="/tags/C.html" title=c>colspan="3">

extern CObjeclass="tags" href="/tags/C.html" title=c>ctManager g_om;

 

JNIEXPORT void JNICALL Java_mypaclass="tags" href="/tags/C.html" title=c>ck_myTest_ nGetB

  (JNIEnv * env, jobjeclass="tags" href="/tags/C.html" title=c>ct obj࿰class="tags" href="/tags/C.html" title=c>c;jint jPtr )

{

class="tags" href="/tags/C.html" title=c>color:blue">    A* ptrA=(A*)jPtr;

    B* ptrB=ptrA->GetB();

    return (int)ptrB;

}

class="tags" href="/tags/C.html" title=c>cellspaclass="tags" href="/tags/C.html" title=c>cing="0" class="tags" href="/tags/C.html" title=c>cellpadding="0">

class="tags" href="/tags/C.html" title=c>color:#009600">//class="tags" href="/tags/C.html" title=c>color:#009600">如果返回的class="tags" href="/tags/C.html" title=c>color:#009600">Bclass="tags" href="/tags/C.html" title=c>color:#009600">对象不是指针类型而是对象本身(class="tags" href="/tags/C.html" title=c>color:#99CC00">在右边一栏的函数声明类似这样class="tags" href="/tags/C.html" title=c>color:#99CC00">B GetB();class="tags" href="/tags/C.html" title=c>color:#009600">)则以上函数中的代码应如下所示

class="tags" href="/tags/C.html" title=c>color:#009600">       A* ptrA=(A*)jPtr;

       B *ptrB=new B();

       (*ptrB) = ptrA ->GetB();

       g_om.Add(ptrB);

       return (int)ptrB;           

class="tags" href="/tags/C.html" title=c>color:#009600">//class="tags" href="/tags/C.html" title=c>color:#009600">且class="tags" href="/tags/C.html" title=c>color:#009600">nfinallizeclass="tags" href="/tags/C.html" title=c>color:#009600">要做如下实现

JNIEXPORT void JNICALL Java_mypaclass="tags" href="/tags/C.html" title=c>ck_myTest_ nfinallize

  (JNIEnv * env, jobjeclass="tags" href="/tags/C.html" title=c>ct obj࿰class="tags" href="/tags/C.html" title=c>c;jint jPtr )

{

       g_om.Remove(jPtr);

}

 

class="tags" href="/tags/C.html" title=c>color:#009600">//class="tags" href="/tags/C.html" title=c>color:#009600">其它函数略

 

class="tags" href="/tags/C.html" title=c>color:#009600">  .hclass="tags" href="/tags/C.html" title=c>color:#009600">文件

class="tags" href="/tags/C.html" title=c>class A{

publiclass="tags" href="/tags/C.html" title=c>c:

       B* GetB();

};

class="tags" href="/tags/C.html" title=c>color:#009600"> .class="tags" href="/tags/C.html" title=c>cppclass="tags" href="/tags/C.html" title=c>color:#009600">文件

B* A::GetB()

{

       return new B();

}class="tags" href="/tags/C.html" title=c>color:#009600">//class="tags" href="/tags/C.html" title=c>color:#009600">这个地方新分配了一个对象而且返回了它的指针࿰class="tags" href="/tags/C.html" title=c>c;我们在class="tags" href="/tags/C.html" title=c>color:#009600">JAVAclass="tags" href="/tags/C.html" title=c>color:#009600">调用的时候不必关心它的释放问题࿰class="tags" href="/tags/C.html" title=c>c;因为只要我们class="tags" href="/tags/C.html" title=c>color:#009600">JAVAclass="tags" href="/tags/C.html" title=c>color:#009600">端完全仿效class="tags" href="/tags/C.html" title=c>color:#009600">C++class="tags" href="/tags/C.html" title=c>color:#009600">运行流程的话࿰class="tags" href="/tags/C.html" title=c>c;class="tags" href="/tags/C.html" title=c>color:#009600">C++class="tags" href="/tags/C.html" title=c>color:#009600">系统会在自己内部释放该对象

class="tags" href="/tags/C.html" title=c>colspan="3">

publiclass="tags" href="/tags/C.html" title=c>c class="tags" href="/tags/C.html" title=c>class JB {

class="tags" href="/tags/C.html" title=c>color:#009600; baclass="tags" href="/tags/C.html" title=c>ckground:#D9D9D9">//Part 1

//略

class="tags" href="/tags/C.html" title=c>color:#009600; baclass="tags" href="/tags/C.html" title=c>ckground:#D9D9D9">//Part 2

publiclass="tags" href="/tags/C.html" title=c>c void TestB(){

       nTestB(ptr);

}

class="tags" href="/tags/C.html" title=c>color:#009600; baclass="tags" href="/tags/C.html" title=c>ckground:#D9D9D9">//Part 3

private native void nTestB(int ptr);

//其它略

class="tags" href="/tags/C.html" title=c>color:#009600; baclass="tags" href="/tags/C.html" title=c>ckground:#D9D9D9">//Part 4

proteclass="tags" href="/tags/C.html" title=c>cted int   ptr;

}

class="tags" href="/tags/C.html" title=c>colspan="2">

extern CObjeclass="tags" href="/tags/C.html" title=c>ctManager g_om;

 

JNIEXPORT void JNICALL Java_mypaclass="tags" href="/tags/C.html" title=c>ck_myTest_ nTestB

  (JNIEnv * env, jobjeclass="tags" href="/tags/C.html" title=c>ct obj,jintjPtr)

{

class="tags" href="/tags/C.html" title=c>color:blue">    B* ptr=(B*)jPtr;

       ptr->TestB();

}

class="tags" href="/tags/C.html" title=c>color:#009600">  .hclass="tags" href="/tags/C.html" title=c>color:#009600">文件

class="tags" href="/tags/C.html" title=c>class B{

publiclass="tags" href="/tags/C.html" title=c>c:

void TestB();

};

class="tags" href="/tags/C.html" title=c>color:#009600">//  .class="tags" href="/tags/C.html" title=c>cppclass="tags" href="/tags/C.html" title=c>color:#009600">文件

void B::TestB()

{

class="tags" href="/tags/C.html" title=c>cout<<”this is B in C++”<<endl;

}

 

结果测试:

class="tags" href="/tags/C.html" title=c>colspan="3">

class="tags" href="/tags/C.html" title=c>center">在JAVA中这样运行

class="tags" href="/tags/C.html" title=c>colspan="2">

class="tags" href="/tags/C.html" title=c>center">假设原C++系统中这样运行

class="tags" href="/tags/C.html" title=c>colspan="3">

JB b=a.GetB();

b.TestB();

class="tags" href="/tags/C.html" title=c>colspan="2">

B* pb=a->GetB();class="tags" href="/tags/C.html" title=c>color:#009600">//class="tags" href="/tags/C.html" title=c>color:#009600">这个地方的class="tags" href="/tags/C.html" title=c>color:#009600">”->”class="tags" href="/tags/C.html" title=c>color:#009600">也可能是class="tags" href="/tags/C.html" title=c>color:#009600">”.”

pb->TestB();

输出:

class="tags" href="/tags/C.html" title=c>colspan="3">

this is B in C++

class="tags" href="/tags/C.html" title=c>colspan="2">

this is B in C++

 

 

4 修改说明

1. 在每个JAVA类的PART4中添加 proteclass="tags" href="/tags/C.html" title=c>cted Boolean isFromReturn; 这个变量只在PART1中使用࿰class="tags" href="/tags/C.html" title=c>c;而且在所有构造函数及finalize中使用。

2. class="tags" href="/tags/C.html" title=c>color:blaclass="tags" href="/tags/C.html" title=c>ck">finalizeclass="tags" href="/tags/C.html" title=c>color:blaclass="tags" href="/tags/C.html" title=c>ck">会存在同步问题。所以要加上class="tags" href="/tags/C.html" title=c>color:#7F0055">synclass="tags" href="/tags/C.html" title=c>chronized

 

下面为一个例子

class="tags" href="/tags/C.html" title=c>color:#008040">//  part1

class="tags" href="/tags/C.html" title=c>color:blaclass="tags" href="/tags/C.html" title=c>ck">    class="tags" href="/tags/C.html" title=c>color:#7F0055">publiclass="tags" href="/tags/C.html" title=c>cclass="tags" href="/tags/C.html" title=c>color:blaclass="tags" href="/tags/C.html" title=c>ck"> CAnalyseRead(class="tags" href="/tags/C.html" title=c>color:navy">FromReturnclass="tags" href="/tags/C.html" title=c>color:blaclass="tags" href="/tags/C.html" title=c>ck"> obj,class="tags" href="/tags/C.html" title=c>color:#7F0055">intclass="tags" href="/tags/C.html" title=c>color:blaclass="tags" href="/tags/C.html" title=c>ck"> exptr){

class="tags" href="/tags/C.html" title=c>color:blaclass="tags" href="/tags/C.html" title=c>ck">      

class="tags" href="/tags/C.html" title=c>color:blaclass="tags" href="/tags/C.html" title=c>ck">       class="tags" href="/tags/C.html" title=c>color:#0000C0"> ptrclass="tags" href="/tags/C.html" title=c>color:blaclass="tags" href="/tags/C.html" title=c>ck"> = exptr;  

class="tags" href="/tags/C.html" title=c>color:blaclass="tags" href="/tags/C.html" title=c>ck">       class="tags" href="/tags/C.html" title=c>color:#0000C0"> isFromReturnclass="tags" href="/tags/C.html" title=c>color:blaclass="tags" href="/tags/C.html" title=c>ck">=class="tags" href="/tags/C.html" title=c>color:#7F0055">trueclass="tags" href="/tags/C.html" title=c>color:blaclass="tags" href="/tags/C.html" title=c>ck">;

class="tags" href="/tags/C.html" title=c>color:blaclass="tags" href="/tags/C.html" title=c>ck">    }

class="tags" href="/tags/C.html" title=c>color:blaclass="tags" href="/tags/C.html" title=c>ck">    class="tags" href="/tags/C.html" title=c>color:#7F0055">publiclass="tags" href="/tags/C.html" title=c>cclass="tags" href="/tags/C.html" title=c>color:blaclass="tags" href="/tags/C.html" title=c>ck"> CAnalyseRead(){

class="tags" href="/tags/C.html" title=c>color:blaclass="tags" href="/tags/C.html" title=c>ck">      

class="tags" href="/tags/C.html" title=c>color:blaclass="tags" href="/tags/C.html" title=c>ck">       class="tags" href="/tags/C.html" title=c>color:#0000C0"> ptrclass="tags" href="/tags/C.html" title=c>color:blaclass="tags" href="/tags/C.html" title=c>ck"> = nCAnalyseRead();

class="tags" href="/tags/C.html" title=c>color:blaclass="tags" href="/tags/C.html" title=c>ck">       class="tags" href="/tags/C.html" title=c>color:#0000C0"> isFromReturnclass="tags" href="/tags/C.html" title=c>color:blaclass="tags" href="/tags/C.html" title=c>ck">=class="tags" href="/tags/C.html" title=c>color:#7F0055">falseclass="tags" href="/tags/C.html" title=c>color:blaclass="tags" href="/tags/C.html" title=c>ck">;

class="tags" href="/tags/C.html" title=c>color:blaclass="tags" href="/tags/C.html" title=c>ck">    }

class="tags" href="/tags/C.html" title=c>color:blaclass="tags" href="/tags/C.html" title=c>ck">   

class="tags" href="/tags/C.html" title=c>color:blaclass="tags" href="/tags/C.html" title=c>ck">    class="tags" href="/tags/C.html" title=c>color:#7F0055">publiclass="tags" href="/tags/C.html" title=c>cclass="tags" href="/tags/C.html" title=c>color:#7F0055">synclass="tags" href="/tags/C.html" title=c>chronizedclass="tags" href="/tags/C.html" title=c>color:#7F0055">voidclass="tags" href="/tags/C.html" title=c>color:blaclass="tags" href="/tags/C.html" title=c>ck"> finalize(){

class="tags" href="/tags/C.html" title=c>color:blaclass="tags" href="/tags/C.html" title=c>ck">       class="tags" href="/tags/C.html" title=c>color:#008040">//System.out.println("CAnalyseRead.finalize");

class="tags" href="/tags/C.html" title=c>color:blaclass="tags" href="/tags/C.html" title=c>ck">       class="tags" href="/tags/C.html" title=c>color:#7F0055">ifclass="tags" href="/tags/C.html" title=c>color:blaclass="tags" href="/tags/C.html" title=c>ck">(!class="tags" href="/tags/C.html" title=c>color:#0000C0">isFromReturnclass="tags" href="/tags/C.html" title=c>color:blaclass="tags" href="/tags/C.html" title=c>ck">)

class="tags" href="/tags/C.html" title=c>color:blaclass="tags" href="/tags/C.html" title=c>ck">           nfinalize(class="tags" href="/tags/C.html" title=c>color:#0000C0">ptrclass="tags" href="/tags/C.html" title=c>color:blaclass="tags" href="/tags/C.html" title=c>ck">);

class="tags" href="/tags/C.html" title=c>color:blaclass="tags" href="/tags/C.html" title=c>ck">    }

class="tags" href="/tags/C.html" title=c>color:#008040">//  part4

class="tags" href="/tags/C.html" title=c>color:blaclass="tags" href="/tags/C.html" title=c>ck">    class="tags" href="/tags/C.html" title=c>color:#7F0055">publiclass="tags" href="/tags/C.html" title=c>cclass="tags" href="/tags/C.html" title=c>color:#7F0055">intclass="tags" href="/tags/C.html" title=c>color:#0000C0">ptrclass="tags" href="/tags/C.html" title=c>color:blaclass="tags" href="/tags/C.html" title=c>ck">;

class="tags" href="/tags/C.html" title=c>color:blaclass="tags" href="/tags/C.html" title=c>ck">    class="tags" href="/tags/C.html" title=c>color:#7F0055">privateclass="tags" href="/tags/C.html" title=c>color:#7F0055">booleanclass="tags" href="/tags/C.html" title=c>color:#0000C0">isFromReturnclass="tags" href="/tags/C.html" title=c>color:blaclass="tags" href="/tags/C.html" title=c>ck">;

 

 

乔成磊 qiaoclass="tags" href="/tags/C.html" title=c>chenglei@163.class="tags" href="/tags/C.html" title=c>com

class="tags" href="/tags/C.html" title=c>cle>

http://www.niftyadmin.cn/n/1310349.html

相关文章

操作系统类

LINUX: 新手硬盘安装Ubuntu一次成功&#xff0c;详细步骤。&#xff08;初步使用非常非常满意&#xff0c;对比Fedora&#xff09; 安装Ubuntu 10.10后XP启动项丢失 XP硬盘安装Ubuntu 10.10双系统图解

python2 unicodeencodeerror_Python2.x的UnicodeEncodeError: ‘ascii’ codec can’t encode异常错误...

刚遇到这个问题的时候,在网上找了 半天,发现都是说 添加如下三行代码即可解决问题,[python]import sysreload(sys)sys.setdefaultencoding(utf-8)import sysreload(sys)sys.setdefaultencoding(utf-8)但是我加了之后还解决不了,经过一番思考和挖掘终于找到本质原因,我是在小小说…

CentOS最小模式下安装VMtools之前要做的工作

一 安装gcc: $yum install gcc gcc-c 二 1. Update the kernel: $ yum update kernel -y 2. Install the kernel-headers, kernel-devel and other required packages: $ yum installkernel-headers kernel-devel gcc make -y3. Reboot the server to make sure it load…

数据分析入门——IPython入门

一、什么是IPython IPython的开发者吸收了标准解释器的基本概念&#xff0c;在此基础上进行了大量的改进&#xff0c;创造出一个令人惊奇的工具。在它的主页上是这么说的&#xff1a;“这是一个增强的交互式Python shell。”具有tab补全&#xff0c;对象自省&#xff0c;强大的…

设计一个三阶巴特沃斯滤波器_巴特沃斯滤波器频率设计及增益多项式方程

在之前的滤波器教程中&#xff0c;我们研究了简单的一阶型低通和高通滤波器&#xff0c;它们的RC滤波器电路设计中只包含一个电阻器和一个无功元件(电容器)。在使用滤波器对信号的频谱进行整形的应用中&#xff0c;例如在通信或控制系统中&#xff0c;滚降的形状或宽度也称为“…

平流式沉淀池流量计算_污水沉淀池的设计要点!

环保工程师专注于知识分享&#xff01;关注平流式沉淀池平流式沉淀池表面形状一般为长方形&#xff0c;水流在进水区经过消能和整流进入沉淀区后&#xff0c;缓慢水平流动&#xff0c;水中可沉悬浮物逐渐沉向池底&#xff0c;沉淀区出水溢过堰口&#xff0c;通过出水槽排出池外…

Linux添加环境变量与GCC编译器添加INCLUDE与LIB环境变量

对所有用户有效在/etc/profile增加以下内容。只对当前用户有效在Home目录下的.bashrc或.bash_profile里增加下面的内容&#xff1a;(注意&#xff1a;等号前面不要加空格,否则可能出现 command not found)#在PATH中找到可执行文件程序的路径。export PATH $PATH:$HOME/bin#gcc找…

createnewfile 有时候能生成文件有时候生成不了_在postman中自动生成请求数据,这个功能你需要知道....

在做接口调试或测试时&#xff0c;请求中的每个参数都要按照接口文档填写到postman的对应位置中&#xff0c;很是麻烦。那是否有这样一个功能&#xff1f;可以帮我们自动生成接口数据&#xff0c;无需修改&#xff0c;直接发送请求就可以呢。这里面我们需要借助于浏览器或其它抓…