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 ...;
}
这个是在 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 ...;
}
你参考一下吧。
内容很丰富。
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();
}
}
}
我的建议如下:
1.定义一个本地方法在你的Java文件中
2.建立一个DLL函数在你的c++中
3.声明该函数,使用Java可以支持的JNI本地类型
4.在c++调用本地函数,将结果转换为JNI支持的类型返回。
注意,如果本地方法需要额外的DLL支持,一定要在调用之前在
Java代码上显式加载System.loadLibrary("XXXXX");更详细的例子你可以到www.codeproject.com的网站上面寻找