void MAC(unsigned char *msg, int length, unsigned char* key,unsigned char* result);
这个是在 c中的函数,已经编译为dll了,该文件可以修改我要用jni来调用这个函数我定义的 java方法是 public native static String MAC(String msg, int length, String key, String result);
不知道这个行不行,还是用 byte[]来代替 String我用javah生成 .h 头文件,并在*.cpp 中加入用javah生成的方法,然后来调用c中的mac方法,所以我需要给MAC函数传值JNIEXPORT jstring JNICALL Java_Wofadesm_MAC (JNIEnv *env, jclass cls, jstring msg1, jint jles1, jstring key1, jstring result1) {
char *msg;
char *key;
char *result;
msg = (char*)(*env).GetStringUTFChars(msg1, 0);
key = (char*)(*env).GetStringUTFChars(key1, 0);
result = (char*)(*env).GetStringUTFChars(result1, 0);
        MAC();//该处我该如何写传入的参数,另外还要返回 jstring类型的值
return ...;
}
 

解决方案 »

  1.   

    就前阵子公司使用加密狗时候接触过JNI
      

  2.   

    http://blog.chinaunix.net/u1/38994/showart_1099528.html
    你参考一下吧。
    内容很丰富。
      

  3.   

    楼主怎么发两遍啊,中文的话转成byte[],纯西文用String没有问题
      

  4.   

    用char来代替String ,到java中转化,注意下高低位public class ReadFile {
    private native char[] ReadFile(String fileName); static {
    System.loadLibrary("ReadFile");
    } public static void main(String[] args) {
    try {
    ReadFile app = new ReadFile();
    char s[] = app.ReadFile("aaa.txt");
    byte b[] = new byte[s.length*2];
    int j=0;
    for (int i=0;i<b.length;i++){
    b[i]=(byte)s[j];
    i++;
    b[i]=(byte)(char)(s[j]/256);
    j++;
    }
    System.out.println((new String(b,0,s.length)).length());
    } catch (Exception e) {
    e.printStackTrace();
    }
    }
    }
      

  5.   

    Java Native Interface ,不懂
      

  6.   

    我看了,你大概是想通过JNI来调用一个OS相关的本地平台接口
    我的建议如下:
    1.定义一个本地方法在你的Java文件中
    2.建立一个DLL函数在你的c++中
    3.声明该函数,使用Java可以支持的JNI本地类型
    4.在c++调用本地函数,将结果转换为JNI支持的类型返回。
    注意,如果本地方法需要额外的DLL支持,一定要在调用之前在
    Java代码上显式加载System.loadLibrary("XXXXX");更详细的例子你可以到www.codeproject.com的网站上面寻找