解决方案 »
- join 方法会不会使线程串行
- Unable to construct record instance
- 关于org.hibernate.HibernateException: No TransactionManagerLookup specified
- hibernate注解联合主键加外键
- 关于使用Sonatype nexus创建Maven私服。
- 多线程该怎么设计?求高手
- 目前主流的java CMS(内容管理系统) 有哪些?
- JBOSS+STRUTS为什么找不到MAPPING啊?谢谢--急啊
- 这段时间学JAAS有所感
- EJB程序的ejbCreate()什么时候调用??
- 首页左栏显示不出来
- SCWCD问题:声明jsp为javascript文件???
#include <windows.h>
#include <jni.h>
#include <iostream>#pragma comment( lib, "jvm.lib" )
int main()
{
JavaVMOption options;
options.optionString = "-Djava.class.path=.";
JNIEnv* env = NULL;
JavaVM* jvm = NULL; JavaVMInitArgs vm_args;
RtlZeroMemory( & vm_args, sizeof( JavaVMInitArgs ) );
vm_args.version = JNI_VERSION_1_6;
vm_args.nOptions = 1;
vm_args.options = & options;
vm_args.ignoreUnrecognized = TRUE; long status = JNI_CreateJavaVM( & jvm, ( void** ) & env, & vm_args );//调用虚拟机
if ( status == JNI_ERR ) {
std::cout << "JNI_CreateJavaVM( ... ) failed ! Return code " << status << " ! " << std::endl;
return 1;
}
jclass cls = env->FindClass( "RtfReader" );//判断类是否存在
if ( cls == 0 ) {
std::cout << "No such class RtfReader !" << std::endl;
jvm->DestroyJavaVM();
return 1;
}
jmethodID mid = env->GetStaticMethodID( cls, "getTextFromRtf", "(Ljava/lang/String;)Ljava/lang/String;" );//判断具体的函数
if ( mid == 0 ) {
std::cout << "No such class Method getTextFromRtf !" << std::endl;
jvm->DestroyJavaVM();
}
std::string strUTF8;
std::string strNew = "Hello ! 我是来自 C++ 的 String !";
mid = env->GetStaticMethodID(cls, "getTextFromRtf", "(C)C");
if (mid !=0)
{
printf("testPrintn");
env->CallStaticVoidMethod(cls, mid,"C:\\test.rtf");
}
jvm->DestroyJavaVM();
return 0;
}
if (mid !=0)
{
printf("testPrintn");
env->CallStaticVoidMethod(cls, mid,"C:\\test.rtf");
}的值一直为0,求高手解答啊
没有 getTextFromRtf,(C)C呀。
if (mid !=0)
{
env->CallStaticVoidMethod(cls, mid,"C:\\test.rtf");
}
改成上面的代码之后,运行出错了。
import java.io.InputStream;
import javax.swing.text.BadLocationException;
import javax.swing.text.DefaultStyledDocument;
import javax.swing.text.rtf.RTFEditorKit;
public class RtfReader {
public RtfReader(){
}
/**
* @param filePath 文件路径
* @return 读出的rtf的内容
*/
public static void getTextFromRtf(String filePath) {
String result = null;
File file = new File(filePath);
try {
DefaultStyledDocument styledDoc = new DefaultStyledDocument();
InputStream is = new FileInputStream(file);
new RTFEditorKit().read(is, styledDoc, 0);
result = new String(styledDoc.getText(0,styledDoc.getLength()).getBytes("ISO8859_1"));
//提取文本,读取中文需要使用ISO8859_1编码,否则会出现乱码
} catch (IOException e) {
e.printStackTrace();
} catch (BadLocationException e) {
e.printStackTrace();
}
System.out.println("------");
System.out.println(result);
System.out.println("------");
}
} JAVA代码改成上面的样子了,编译没有报错,运行的时候就出错了
# An unexpected error has been detected by Java Runtime Environment:
#
# EXCEPTION_ACCESS_VIOLATION (0xc0000005) at pc=0x6d880505, pid=1020, tid=2600
#
# Java VM: Java HotSpot(TM) Client VM (1.6.0_02-b06 mixed mode, sharing)
# Problematic frame:
# V [jvm.dll+0xc0505]
#
# If you would like to submit a bug report, please visit:
# http://java.sun.com/webapps/bugreport/crash.jsp
#
运行后显示的结果
调用一个方法需要两个步骤:获取方法句柄和调用方法。
jmethodID methodID = env->GetMethodID( JavaClass, "setTest","(I)V");
if(methodID!=0)//获取方法成功
{
env->CallVoidMethod( obj, methodID,12);
}
GetStaticMethodID是用来获取静态方法的定义,GetMethodID则是获取非静态的方法定义。他们传入参数的参数依次为:类定义、方法名称和方法的定义,方法的定义可以用jdk中带的javap工具反编译class文件获取,其格式如下:
public void setTest(int inTest);
Signature: (I)V
Signature后面的内容就是方法的定义。
CallVoidMethod是对获取的方法进行调用,JNI接口中提供了一系列的同类方法,包括静态方法的调用函数(如:CallStaticXXXMethod)和非静态的方法(如:CallXXXMethod),其中XXX表示的不同方法返回类型,包括int、object等等。