再使用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 < strlen(str1); 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 < 3; 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分