1.问题的处理方案的正确而完整的描述称为:_______ 。
2.二叉树的中度为2的节点只有18个节点,则该二叉树中有_____个叶子节点。给出计算方法。
3. 编写级联如:
       中央卫视
           人员登记
           文档
               公司介绍
4.Java本地调用如何实现 ?

解决方案 »

  1.   

    1.算法
    2.19 http://wenwen.soso.com/z/q125067829.htm?rq=7383965&ri=5&uid=0
      

  2.   

    4.java本地调用JNI Java Native Interface
      

  3.   

    4.java本地调用JNI Java Native Interface实际上,有一种通常为我们忽视的技术可以在很大程度上解决这个难题,那就是JNI(Java Native Interface, Java本地化方法)。主张采用纯Java的人们通常反对本地化代码的使用,他们认为在Java程序执行的过程中调用C/C++程序会影响程序的可移植性和安全性。还有一些人认为JNI只是对过去混合编程技术的简单扩展,其实际目的是为了充分利用大量原有的C程序库。 
    其实,我们不必拘泥于严格的平台独立性限制,因为采用JNI技术只是针对一些严重影响Java性能的代码段,该部分可能只占源程序的极少部分,所以几乎可以不考虑该部分代码在主流平台之间移植的工作量。同时,也不必过分担心类型匹配问题,我们完全可以控制代码不出现这种错误。此外,也不必担心安全控制问题,因为Java安全模型已扩展为允许非系统类加载和调用本地方法。根据Java规范,从JDK 1. 2开始,FindClass将设法找到与当前的本地方法关联的类加载器。如果平台相关代码属于一个系统类,则无需涉及任何类加载器; 否则,将调用适当的类加载器来加载和链接已命名的类。换句话说,如果在Java程序中直接调用C/C++语言产生的机器码,该部分代码的安全性就由Java虚拟机控制。 
    JNI实现步骤 
    编写JNI代码的大致流程如下图所示: 
    JNI实现流程
    1. 首先编写需要JNI功能的Java类源文件。其中,需要JNI实现的方法应当用native关键字声明。在该类中,用System. loadLibrary()方法加载需要的动态链接库。关键代码如下: 
    //Compute.java 
    …… 
    public class Compute { 
    public native double comp (double [] params); 
    …… 
    static { 
    // 调用动态链接库 
    System. loadLibrary(“mathlib”); 

    …… 

    2. 将该类源文件用Java类编译器编译成二进制字节码文件。由于采用了native关键字声明,编译器会忽视没有代码体的JNI方法部分。 
    3. 利用javah -jni *.class 生成相关JNI方法的头文件。我们可以手工生成该文件,但是由于Java虚拟机是根据一定的命名规范完成对JNI方法的调用,所以手工编写头文件需要特别小心。 
    上述文件产生的头文件部分代码如下: 
    //Compute. h 
    …… 
    extern “C” { 
    JNIEXPORT jdouble JNICALL Java_Compute_comp (JNIEnv *, jobject, jdoubleArray); 

    …… 
    可以看出,JNI函数名称分为三部分:首先是Java关键字,供Java虚拟机识别;然后是调用者类名称(全限定的类名,其中用下划线代替名称分隔符);最后是对应的方法名称,各段名称之间用下划线分割。 
    JNI函数的参数也由三部分组成: 首先是JNIEnv *,是一个指向JNI运行环境的指针;第二个参数随本地方法是静态还是非静态而有所不同——非静态本地方法的第二个参数是对对象的引用,而静态本地方法的第二个参数是对其 Java 类的引用; 其余的参数对应通常 Java 方法的参数,参数类型需要根据一定规则进行映射。 
    4. 根据头文件编写相应方法的实现代码。由于篇幅所限,具体的实现部分在此不再赘述。在编码过程中,需要注意变量的长度问题,例如Java的整型变量长度为32位,而C语言为16位,所以要仔细核对变量类型映射表,防止在传值过程中出现问题。 
    5. 利用C/C++编译器将JNI实现代码编译成动态链接库。调用者类中需要显式调用该链接库。 
    在Win32环境下,可以利用Visual C ++或其他能产生DLL文件的C/C++编译器将实现代码编译成动态链接库。笔者利用的是Microsoft.NET Framework的编译器。编译指令如下,其中%Java_HOME%是笔者的jdk安装目录变量: 
    cl -I%Java_HOME%\include 
    -I%Java_HOME%\include\win32 
    -LD jnicomp. c -Femathlib. dll 
    在Sun Soloaris下,相应指令为: 
    cc -G -I/usr/local/java/include -I/usr/local/java/include/solaris jnicomp. c \ 
    -o mathlib. so 
    注意,编译的时候需要用I指令包含必要的库文件路径。 
    经过上述处理,就基本上完成了一个包含本地化方法的Java类的开发。 
      

  4.   

    JNI的技术
    http://zhaosheng.wolf.blog.163.com/blog/static/115304589200991211457365/