JNI学习笔记
C调用JAVA
1 编写JAVA类
public class Welcome {
public static void main(String[] args) {
String[] greeting = new String[3];
greeting[0] = "Welcome to Core Java";
greeting[1] = "by Cay Horsmann";
greeting[2] = "and Gary Cornell";
for (String g: greeting)
System.out.println(g);
}
}
2 JAVAC编译Welcome.java生成Welcome.class
3 编写C程序NativeCall.c
// Native Call.c : Defines the entry point for the console application.
#include <jni.h>
#include <stdlib.h>
int main()
{
JavaVMOption options[1];
JavaVMInitArgs vm_args;
JavaVM *jvm;
JNIEnv *env;
long status;
jclass class_Welcome;
jclass class_String;
jobjectArray args;
jmethodID id_main;
/*JNI 调试信息开关*/
/*options[0].optionString="-verbose:jni";
options[1].optionString = "-Djava.class.path=.";*/
options[0].optionString = "-Djava.class.path=.";//设置运行环境,指示Class文件在当前目录下
memset(&vm_args, 0, sizeof(vm_args));
vm_args.version = JNI_VERSION_1_6;
vm_args.nOptions = 1;
vm_args.options = options;
status = JNI_CreateJavaVM(&jvm, (void **)&env, &vm_args);
printf("%d/n", status);
if (status == JNI_ERR) {
printf("Error creating VM/n");
return 1;
}
//main logic
class_Welcome = (*env)->FindClass(env, "Welcome");
id_main =
(*env)->GetStaticMethodID(env, class_Welcome, "main", "([Ljava/lang/String;)V");
/*
([Ljava/lang/String;)V 为main函数的方法签名,可以通过用于看*.class文件的反汇编命令javap -s -c Welcome
得到该方法的签名Signature
*/
class_String = (*env)->FindClass(env, "java/lang/String");
args = (*env)->NewObjectArray(env, 0, class_String, NULL);
(*env)->CallStaticVoidMethod(env, class_Welcome, id_main, args);
//main logic finished
(*jvm)->DestroyJavaVM(jvm);
return 0;
}
4 在当前目录下运行命令:cl -I C:/Java/jdk1.6.0/include -I C:/Java/jdk1.6.0/include/win32 NativeCall.c C:/Java/jdk1.6.0/lib/jvm.lib
成功后生成NativeCall.exe,命令行中运行该exe文件得到执行结果.
(以上程序都是在同一个文件夹中进行的)
如果采用VC编程环境,需要在IDE中设置头文件jni.h所在的目录,Tools---Options---Directories在拉框Show directory for...中
选择Include files加入C:/Java/jdk1.6.0/include;C:/Java/jdk1.6.0/include/win32(主要是需要jni.h,jni_md.h)
选择Libiary files加入C:/Java/jdk1.6.0/lib(主要需要jvm.lib)
C调用JAVA
1 编写JAVA类
public class Welcome {
public static void main(String[] args) {
String[] greeting = new String[3];
greeting[0] = "Welcome to Core Java";
greeting[1] = "by Cay Horsmann";
greeting[2] = "and Gary Cornell";
for (String g: greeting)
System.out.println(g);
}
}
2 JAVAC编译Welcome.java生成Welcome.class
3 编写C程序NativeCall.c
// Native Call.c : Defines the entry point for the console application.
#include <jni.h>
#include <stdlib.h>
int main()
{
JavaVMOption options[1];
JavaVMInitArgs vm_args;
JavaVM *jvm;
JNIEnv *env;
long status;
jclass class_Welcome;
jclass class_String;
jobjectArray args;
jmethodID id_main;
/*JNI 调试信息开关*/
/*options[0].optionString="-verbose:jni";
options[1].optionString = "-Djava.class.path=.";*/
options[0].optionString = "-Djava.class.path=.";//设置运行环境,指示Class文件在当前目录下
memset(&vm_args, 0, sizeof(vm_args));
vm_args.version = JNI_VERSION_1_6;
vm_args.nOptions = 1;
vm_args.options = options;
status = JNI_CreateJavaVM(&jvm, (void **)&env, &vm_args);
printf("%d/n", status);
if (status == JNI_ERR) {
printf("Error creating VM/n");
return 1;
}
//main logic
class_Welcome = (*env)->FindClass(env, "Welcome");
id_main =
(*env)->GetStaticMethodID(env, class_Welcome, "main", "([Ljava/lang/String;)V");
/*
([Ljava/lang/String;)V 为main函数的方法签名,可以通过用于看*.class文件的反汇编命令javap -s -c Welcome
得到该方法的签名Signature
*/
class_String = (*env)->FindClass(env, "java/lang/String");
args = (*env)->NewObjectArray(env, 0, class_String, NULL);
(*env)->CallStaticVoidMethod(env, class_Welcome, id_main, args);
//main logic finished
(*jvm)->DestroyJavaVM(jvm);
return 0;
}
4 在当前目录下运行命令:cl -I C:/Java/jdk1.6.0/include -I C:/Java/jdk1.6.0/include/win32 NativeCall.c C:/Java/jdk1.6.0/lib/jvm.lib
成功后生成NativeCall.exe,命令行中运行该exe文件得到执行结果.
(以上程序都是在同一个文件夹中进行的)
如果采用VC编程环境,需要在IDE中设置头文件jni.h所在的目录,Tools---Options---Directories在拉框Show directory for...中
选择Include files加入C:/Java/jdk1.6.0/include;C:/Java/jdk1.6.0/include/win32(主要是需要jni.h,jni_md.h)
选择Libiary files加入C:/Java/jdk1.6.0/lib(主要需要jvm.lib)