应该没问题的。是不是想通过JNI去访问C++代码,而且想把C++其中封装在一个动态库中。

解决方案 »

  1.   

    是啊,想通过jni去访问一个c的动态库(自己写的),
    可是不是先要编译.H文件吗?两个java文件用一个动态库该怎么办?
      

  2.   

    你可以把两个JAVA程序编译出来的头和为一个啊就是把每个函数口放到一个文件下
      

  3.   

    给你写了个例子:这个是a.java
    class a
    {
        static
        {
            try
            {
                System.loadLibrary("a");
            }
            catch(Exception e)
            {
                System.out.println(e);
            }
        }
        public static void main(String args[])
        {
            a m = new a();
            System.out.println(m.s(123));
            b o = new b();
            System.out.println(o.ss(567));
        }
        native public int s(int a);
    }这个是b.javaclass b
    {
      native public int ss(int a);
    }这个是a.h
    /* DO NOT EDIT THIS FILE - it is machine generated */
    #include <jni.h>
    /* Header for class a */#ifndef _Included_a
    #define _Included_a
    #ifdef __cplusplus
    extern "C" {
    #endif
    /*
     * Class:     a
     * Method:    s
     * Signature: (I)I
     */
    JNIEXPORT jint JNICALL Java_a_s
      (JNIEnv *, jobject, jint);#ifdef __cplusplus
    }
    #endif
    #endif这个是b.h/* DO NOT EDIT THIS FILE - it is machine generated */
    #include <jni.h>
    /* Header for class b */#ifndef _Included_b
    #define _Included_b
    #ifdef __cplusplus
    extern "C" {
    #endif
    /*
     * Class:     b
     * Method:    ss
     * Signature: (I)I
     */
    JNIEXPORT jint JNICALL Java_b_ss
      (JNIEnv *, jobject, jint);#ifdef __cplusplus
    }
    #endif
    #endif这个是我修改后的 a.h/* DO NOT EDIT THIS FILE - it is machine generated */
    #include <jni.h>
    /* Header for class a */#ifndef _Included_a
    #define _Included_a
    #ifdef __cplusplus
    extern "C" {
    #endif
    /*
     * Class:     a
     * Method:    s
     * Signature: (I)I
     */
    JNIEXPORT jint JNICALL Java_a_s
      (JNIEnv *, jobject, jint);
      
    JNIEXPORT jint JNICALL Java_b_ss
      (JNIEnv *, jobject, jint);#ifdef __cplusplus
    }
    #endif
    #endif这个是a.cpp#include "a.h"
    JNIEXPORT jint JNICALL Java_a_s
      (JNIEnv *, jobject, jint)
    {
        return 999;
    }
      
      
      
    JNIEXPORT jint JNICALL Java_b_ss
      (JNIEnv *, jobject, jint)
    {
        return 888;
    }用这个命令编译:cl -ID:\jdk1.4\include -ID:\jdk1.4\include\win32 -LD a.cpp  -Fea.dll运行java a就可以看到效果了。
      

  4.   

    To elabs(洋洋) :
    可是你说的办法是两个java文件用同一个动态库中的不同函数,
    如果我想用同一个动态库中的同一个函数有办法没?我总不至于
    把同一个函数就头改一下写两遍吧?太土了。
    不过你说的也是一个解决办法,先给一半分吧,如果都解决了再给另外一半。
      

  5.   

    你说的可能不可行,因为你仔细看看就知道,从JAVA中倒出的函数和JAVA中的类名和包名有关,掉用的时候JAVA 应该是根据这个去调用函数,所以可能只能如此了.
      

  6.   

    实际上,你通过JNI不可能产生不同类,而生成相同的头定义,即使你在两个类中定义相同的函数名,导出的函数名也不同,不同包也是如此,自己注意看一下头的函数名称。不然JAVA通过什么去DLL中找函数地址啊。
      

  7.   

    实在懒得写两遍,只能在C下 a函数调用b函数。就省得写这么多了。