java代码如下:
public class NativeTest{
public String result="";
public static void main(String[] args){
System.out.println("hello");
}
public static String init(String[] args){
System.out.println(args.length);
System.out.println(args[0]);
return "成功";
}
}
c++代码如下:#include "stdafx.h"
#include <jni.h>
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
#include "string.h"
#define JNI_VERSION_1_4 0x00010004
#pragma comment (lib,"jvm.lib")
typedef jint (JNICALL *JNICreatePROC)(JavaVM **, void **, void *);char* jstringToWindows( JNIEnv *env, jstring jstr )
{
int length = (env)->GetStringLength(jstr );
const jchar* jcstr = (env)->GetStringChars(jstr, 0 );
char* rtn = (char*)malloc( length*2+1 );
int size = 0;
size = WideCharToMultiByte( CP_ACP, 0, (LPCWSTR)jcstr, length, rtn,(length*2+1), NULL, NULL );
if( size <= 0 )
return NULL;
(env)->ReleaseStringChars(jstr, jcstr );
rtn[size] = 0;
return rtn;
} jstring WindowsTojstring( JNIEnv* env, char* str )
{
jstring rtn = 0;
int slen = strlen(str);
unsigned short* buffer = 0;
if( slen == 0 )
rtn = env->NewStringUTF(str);
else
{
int length = MultiByteToWideChar( CP_ACP, 0, (LPCSTR)str, slen, NULL, 0 );
buffer =(unsigned short*) malloc( length*2 + 1 );
if( MultiByteToWideChar( CP_ACP, 0, (LPCSTR)str, slen, (LPWSTR)buffer, length ) >0 )
rtn = env->NewString((jchar*)buffer, length );
}
if( buffer )
free( buffer );
return rtn;
}
int main(){JavaVM *jvm;
JNIEnv *env;
JavaVMInitArgs vm_args;
JavaVMOption options[3];
vm_args.version=JNI_VERSION_1_4; options[0].optionString = "-Djava.compiler=NONE";
options[1].optionString = "-Djava.class.path=.";
options[2].optionString = " ";
vm_args.nOptions =3;
vm_args.options = options;
vm_args.ignoreUnrecognized = JNI_TRUE;
//------------------------------加载jvm:
HINSTANCE jvmDll = LoadLibrary("C:\\Program Files\\Java\\jdk1.6.0_03\\jre\\bin\\client\\jvm.dll");
if (jvmDll == NULL) printf("加载JVM动态库错误%l", ::GetLastError());
//查找JNI_CreateJavaVM过程。
JNICreatePROC jvmCreateProc = (JNICreatePROC)GetProcAddress(jvmDll, "JNI_CreateJavaVM");
if (jvmCreateProc == NULL)
{
FreeLibrary(jvmDll);
printf("查找JNI_CreateJavaVM过程错误%l", ::GetLastError());
}
//创建JVM: int res = (jvmCreateProc)(&jvm, (void **)&env, &vm_args);
if (res < 0 || jvm == NULL || env == NULL)
{
FreeLibrary(jvmDll);
printf( "创建JVM发生错误");
}
jclass mainClass = env->FindClass("NativeTest");
jmethodID method = env->GetStaticMethodID(mainClass,"init","([Ljava/lang/String;)V");
jclass stringClass = env->FindClass("java/lang/String");
jobjectArray args = env->NewObjectArray(1,stringClass,NULL);
env->SetObjectArrayElement(args,0,WindowsTojstring(env,"今天"));
env->CallStaticObjectMethod(mainClass,method,args); //运行到这里就出错,
FreeLibrary(jvmDll);
return 0;
}
int init(const char * path){
return 0;
}
每次运行到env->CallStaticObjectMethod(mainClass,method,args);就出错,如果改为:
jmethodID method = env->GetStaticMethodID(mainClass,"main","([Ljava/lang/String;)V");就没错请叫高手救急啊!
public class NativeTest{
public String result="";
public static void main(String[] args){
System.out.println("hello");
}
public static String init(String[] args){
System.out.println(args.length);
System.out.println(args[0]);
return "成功";
}
}
c++代码如下:#include "stdafx.h"
#include <jni.h>
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
#include "string.h"
#define JNI_VERSION_1_4 0x00010004
#pragma comment (lib,"jvm.lib")
typedef jint (JNICALL *JNICreatePROC)(JavaVM **, void **, void *);char* jstringToWindows( JNIEnv *env, jstring jstr )
{
int length = (env)->GetStringLength(jstr );
const jchar* jcstr = (env)->GetStringChars(jstr, 0 );
char* rtn = (char*)malloc( length*2+1 );
int size = 0;
size = WideCharToMultiByte( CP_ACP, 0, (LPCWSTR)jcstr, length, rtn,(length*2+1), NULL, NULL );
if( size <= 0 )
return NULL;
(env)->ReleaseStringChars(jstr, jcstr );
rtn[size] = 0;
return rtn;
} jstring WindowsTojstring( JNIEnv* env, char* str )
{
jstring rtn = 0;
int slen = strlen(str);
unsigned short* buffer = 0;
if( slen == 0 )
rtn = env->NewStringUTF(str);
else
{
int length = MultiByteToWideChar( CP_ACP, 0, (LPCSTR)str, slen, NULL, 0 );
buffer =(unsigned short*) malloc( length*2 + 1 );
if( MultiByteToWideChar( CP_ACP, 0, (LPCSTR)str, slen, (LPWSTR)buffer, length ) >0 )
rtn = env->NewString((jchar*)buffer, length );
}
if( buffer )
free( buffer );
return rtn;
}
int main(){JavaVM *jvm;
JNIEnv *env;
JavaVMInitArgs vm_args;
JavaVMOption options[3];
vm_args.version=JNI_VERSION_1_4; options[0].optionString = "-Djava.compiler=NONE";
options[1].optionString = "-Djava.class.path=.";
options[2].optionString = " ";
vm_args.nOptions =3;
vm_args.options = options;
vm_args.ignoreUnrecognized = JNI_TRUE;
//------------------------------加载jvm:
HINSTANCE jvmDll = LoadLibrary("C:\\Program Files\\Java\\jdk1.6.0_03\\jre\\bin\\client\\jvm.dll");
if (jvmDll == NULL) printf("加载JVM动态库错误%l", ::GetLastError());
//查找JNI_CreateJavaVM过程。
JNICreatePROC jvmCreateProc = (JNICreatePROC)GetProcAddress(jvmDll, "JNI_CreateJavaVM");
if (jvmCreateProc == NULL)
{
FreeLibrary(jvmDll);
printf("查找JNI_CreateJavaVM过程错误%l", ::GetLastError());
}
//创建JVM: int res = (jvmCreateProc)(&jvm, (void **)&env, &vm_args);
if (res < 0 || jvm == NULL || env == NULL)
{
FreeLibrary(jvmDll);
printf( "创建JVM发生错误");
}
jclass mainClass = env->FindClass("NativeTest");
jmethodID method = env->GetStaticMethodID(mainClass,"init","([Ljava/lang/String;)V");
jclass stringClass = env->FindClass("java/lang/String");
jobjectArray args = env->NewObjectArray(1,stringClass,NULL);
env->SetObjectArrayElement(args,0,WindowsTojstring(env,"今天"));
env->CallStaticObjectMethod(mainClass,method,args); //运行到这里就出错,
FreeLibrary(jvmDll);
return 0;
}
int init(const char * path){
return 0;
}
每次运行到env->CallStaticObjectMethod(mainClass,method,args);就出错,如果改为:
jmethodID method = env->GetStaticMethodID(mainClass,"main","([Ljava/lang/String;)V");就没错请叫高手救急啊!
解决方案 »
免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货