java的create vm_C调用java JNI_CreateJavaVM只能调用成功一次

https://bbs.csdn.net/topics/392264971

再使用c语言调用java代码的时候,选择使用JNI,根据网上的提示已经能够正常跑了,

int mask_name( char* NAME, char * keyValue, char * weight )

{

/*

接下来,声明所有希望在程序中使用的变量。

JavaVMOption options[] 具有用于 JVM 的各种选项设置。

当声明变量时,确保所声明的JavaVMOption options[] 数组足够大,以便能容纳您希望使用的所有选项。

在本例中,我们使用的唯一选项就是类路径选项。

因为在本示例中,我们所有的文件都在同一目录中,所以将类路径设置成当前目录。

可以设置类路径,使它指向任何您希望使用的目录结构。*/

JavaVMOption options[4];

JNIEnv *env;

JavaVM *jvm;

JavaVMInitArgs vm_args;

/*JNIEnv *env          表示 JNI 执行环境。

JavaVM jvm             是指向 JVM 的指针,我们主要使用这个指针来创建、初始化和销毁 JVM。

JavaVMInitArgs vm_args 表示可以用来初始化 JVM 的各种 JVM 参数。*/

long status;

jclass cls;

jmethodID mid;

jstring square;

/*avaVMInitArgs 结构表示用于 JVM 的初始化参数。

在执行 Java 代码之前,可以使用这些参数来定制运行时环境。

正如您所见,这些选项是一个参数,而 Java 版本是另一个参数。

按如下所示设置了这些参数:*/

/*为 JVM 设置类路径,以使它能找到所需要的 Java 类。

在这个特定示例中,因为 Sample2.class 和Sample2.exe 都位于同一目录中,所以将类路径设置成当前目录。

我们用来为 Sample2.c 设置类路径的代码如下所示:*/

options[0].optionString = "-Djava.compiler=NONE";

options[1].optionString = "-Djava.class.path=C:\\algorithmfordm.jar";

options[2].optionString = "-Djava.library.path=C:\\Program Files\\Java\\jdk1.7.0_03\\jre\\bin\\server";  //指定加载的so路径

options[3].optionString = "-verbose:NONE"; //用于跟踪运行时的信息

//options[1].optionString = "-verbose.jni";

//options[0].optionString = "-Djava.class.path=.";

memset(&vm_args, 0, sizeof(vm_args));

vm_args.version=JNI_VERSION_1_6;//jdk版本1.6

vm_args.nOptions = 4;

vm_args.options = options;

vm_args.ignoreUnrecognized = JNI_TRUE;

/*创建 JVM

处理完所有设置之后,现在就准备创建 JVM 了。先从调用方法开始

如果成功,则这个方法返回零,否则,如果无法创建 JVM,则返回JNI_ERR。*/

status = JNI_CreateJavaVM(&jvm, (void**)&env, &vm_args);

printf("--------------------****%ld\n",status);

if (status != JNI_ERR)

{

/*

查找并装入 Java 类

一旦创建了 JVM 之后,就可以准备开始在本机应用程序中运行 Java 代码。

首先,需要使用FindClass() 函数查找并装入 Java 类,如下所示:

cls 变量存储执行FindClass() 函数后的结果,如果找到该类,则 cls 变量表示该Java 类的句柄,

如果不能找到该类,则 cls 将为零。

*/

cls = (*env)->FindClass(env, "com/wiseweb/algorithm/MobilePhoneFilterAlgorithm");

//(*env)->FindClass(env, "jni/JniTest");

printf("test1,cls=%d...\n",cls);

if(cls !=0)

{

/*

查找 Java 方法

接下来,我们希望用 GetStaticMethodID() 函数在该类中查找某个方法。

我们希望查找方法 intMethod,它接收一个 int 参数并返回一个 int。

以下是查找 intMethod 的代码:

*/

mid = (*env)->GetStaticMethodID(env, cls, "getModelMobilePhone", "(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;");

//mid = (*env)->GetStaticMethodID(env, cls, "getObjectMethod", "(Ljava/lang/Object;)Ljava/lang/Object;");

/*

mid 变量存储执行 GetStaticMethodID() 函数后的结果。

如果找到了该方法,则 mid 变量表示该方法的句柄。

如果不能找到该方法,则mid 将为零。

*/

if(mid !=0)

{

/*CallStaticIntMethod() 方法接受 cls(表示类)、mid(表示方法)以及用于该方法一个或多个参数。

在本例中参数是 int 5。*/

//char * p = "422202199109300010";

char showTime[20];

char * t = getTime(showTime);

jstring value = (*env) ->NewStringUTF(env , NAME);

//char *str = (char *)(*env)->GetStringUTFChars(env,value,0);

//printf("%s\n",str);

jstring keyvalue = (*env) ->NewStringUTF(env , keyValue);

jstring timevalue1 = (*env) ->NewStringUTF(env , t);

jstring quanzhi = (*env) ->NewStringUTF(env , weight);

square = (jstring)(*env)->CallStaticObjectMethod(env, cls, mid,value,keyvalue,timevalue1,quanzhi);

//square = (*env)->CallStaticIntMethod(env, cls, mid,4);

char *str1 = (char *)(*env)->GetStringUTFChars(env,square,0);

//printf("%s\n",str1);

memset(NAME,0X00,11);

if(strcmp(NAME, str1) != 0){

int i ;

for(i = 0; i 

NAME[i] = str1[i];

}

}

}

}

if ((*env)->ExceptionOccurred(env)) {

(*env)->ExceptionDescribe(env);

}

jint end = (*jvm)->DestroyJavaVM(jvm);

printf("-------------00000000000--%d\n",end);

return 0;

}

else

{

return -1;

}

}

int main()

{

int k ;

for(k = 0; k 

char NAME[] = {"15007113427"};

char keyValue[] = {"457685645971234574"};

char weight[] = {"40"};

mask_name(NAME,keyValue,weight);

//printf("Hello world!%d\n",sizeof(NAME));

printf("-----------------------11111111111--------%s\n",NAME);

}

system ("pause");

return 0;

}

问题点数:40分

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值