如何运行这个例子:
编译C程序:
执行:
1. 执行命令 "javac CJava.java" 编译 java代码。
2. 添加头文件目录 JAVA_HOME/include
3. 添加库文件 JAVA_HOME/jre/lib/i386/server
4. 添加 JAVA_HOME/jre/lib/i386/server/libjvm.so (jvm动态库)
5. 编译和执行CJava.c程序。
注意:
1.你必须安装JDK 1.6和配置java的JAVA_HOME环境变量和路径。
2.exec命令”javap - s - p CJava”查看签名的方法。
CJava.java:
//package jni;
public class CJava {
public static String getstring(String str){
return str + " ---> added";
}
public static int add(int a, int b) {
return a + b;
}
public int sub(int a, int b) {
return a - b;
}
public static void main(String[] args) {
System.out.println("Hello world!");
}
}
#include <stdio.h>
#include <jni.h>
#include <stdarg.h>
int main()
{
JavaVMOption options[1];
JNIEnv *env;
JavaVM *jvm;
JavaVMInitArgs vm_args;
long status;
jclass cls;
jmethodID mid;
char* class_name="CJava";
options[0].optionString = "-Djava.class.path=.";
vm_args.version = JNI_VERSION_1_6;
vm_args.nOptions = 1;
vm_args.options = options;
vm_args.ignoreUnrecognized = JNI_TRUE;
/* 创建 Java VM */
status = JNI_CreateJavaVM(&jvm, (void**)&env, &vm_args);
if (status < 0 || status == JNI_ERR) {
printf("Status of creating Java VM:%d\n",status);
fprintf(stderr, "Failed to create Java VM!\n");
return 1;
}
/*查找java类*/
cls = (*env)->FindClass(env, class_name);
if(cls !=0)
{
/*测试调用静态方法*/
char* static_method_name="add";
char* static_method_sign="(II)I";
/*获取方法ID*/
mid = (*env)->GetStaticMethodID(env, cls, static_method_name, static_method_sign);
if(mid !=0)
{
/*调用静态方法*/
jint result = (*env)->CallStaticIntMethod(env, cls, mid, 5,1);
printf("Call static method %s: %d\n",static_method_name,result);
}else{
printf("Failed to find method %s!\n",static_method_name);
}
/*测试调用<span style="color: rgb(51, 51, 51); font-family: Arial; line-height: 26px;">类的方法</span>*/
char* instance_method_name="sub";
char* instance_method_sign="(II)I";
jmethodID constructor_mid = (*env)->GetMethodID(env,cls,"<init>","()V"); //The construcotr method name is <init>
jobject jobj = (*env)->NewObject(env,cls,constructor_mid);
/*获取方法ID*/
mid = (*env)->GetMethodID(env,cls,instance_method_name,instance_method_sign);
if(mid !=0)
{
/*调用方法*/
jint result = (*env)->CallIntMethod(env, jobj, mid, 9,4);
printf("Call instance method %s: %d\n",instance_method_name,result);
}else{
printf("Failed to find method %s!\n",instance_method_name);
}
}else{
printf("Failed to find Class %s!\n",class_name);
}
/*销毁 JVM*/
(*jvm)->DestroyJavaVM(jvm);
return 0;
}
编译java代码:
javac CJava.java
编译C程序:
gcc -o cjava -I$JAVA_HOME/include -I$JAVA_HOME/include/linux -L$JAVA_HOME/bin -L$JAVA_HOME/jre/lib/i386/server CJava.c -ljvm
执行:
./cjava