如何在JNI中使用线程

 我来答
清脆又悉心丶光芒9357
2017-05-24 · TA获得超过161个赞
知道答主
回答量:269
采纳率:0%
帮助的人:79.2万
展开全部
虽详细,步骤都已相明确.
.C/C++调用Java
C/C++调用Java般五步骤:初始化虚拟机、获取类、创建类象、调用退虚拟机
1. 初始化虚拟机
代码:
JNIEnv *env;
JavaVM *jvm;
JavaVMInitArgs vm_args;
JavaVMOption options[3];
int res;
//设置参数
options[0].optionString = "-Djava.compiler=NONE";
//classpathUNIX:割
options[1].optionString = "-Djava.class.path=.";
options[2].optionString = "-verbose:jni";

vm_args.version = JNI_VERSION_1_4;
vm_args.nOptions = 3;
vm_args.options = options;
vm_args.ignoreUnrecognized = JNI_TRUE;
res = JNI_CreateJavaVM(&jvm, (void**)&env, &vm_args);
if (res >= 0)
{
//创建虚拟机功
}
应用程序需要虚拟机每线程需要自虚拟机运行环境我虚拟机获取前线程运行环境代码:
int result=0;
result=jvm->AttachCurrentThread( reinterpret_cast( &env ), 0 );
if(result>=0)
{
//获取运行环境功
}
线程退需要释放本线程使用运行环境
jvm->DetachCurrentThread();
2 获取类
进行调用前需要先获取相应类类名称必须包括包名其.用/代替
jclass JavaClass;
JavaClass = env->FindClass("com/test/TestInterface");
if(JavaClass != 0)
{
//获取功
}
3 创建类象
需要调用静态则跳本步骤反则需要构造该象构造象通调用类构造函数实现构咱函数声明, GetMethodID参数步骤详细说明
jobject obj;
jmethodID ctor;
ctor = env->GetMethodID(JavaClass,"","()V");
if(ctor != 0)//获取功
{
obj = env->NewObject(JavaClass, ctor);
}
4 调用
调用需要两步骤:获取句柄调用
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等等
5 退虚拟机
退虚拟机调用:
jvm->DestroyJavaVM();
JNI接口定义线程退该才返我用线程调用该返故建议系统退执行该或者整程序退让虚拟机自释放
[注意]:
l 处理文字符串需要注意Javachar双字节采用Unicode编码C++char转换需要用系统API:WideCharToMultiByteMultiByteToWideChar
l 注意运行环境象引用释放免引起内存泄漏
jstring str;
wchar_t *w_buffer =(wchar_t *)env->GetStringChars(str,0);
env->ReleaseStringChars(str,(const unsigned short *)w_buffer);
6 处理异
C/C++调用Java定要捕获并处理Java抛异信息否则能导致C/C++进程核转储(Core Dump)
异应每调用检查:
msg = (jstring)env->CallObjectMethod(obj, mid);
if (env->ExceptionOccurred())
{
env->ExceptionDescribe();
env->ExceptionClear();
return 0;
}
二.Java调用C/C++
Java调用C/C++遵循几步骤:
1、 用Java native关键字声明本(非Java语言实现)
2、 编译该声明类XXX.class文件
3、 用javah –jni XXX命令该class文件C语言文件(XXX.h)
4、 采用C语言实现该文件声明实现类编译库文件(libXXX.so)
5、 Java程序使用System.loadLibrary(XXX)加载该库文件(需要设置-Djava.library.path环境变量指向该库文件存放路径)
6、 即象调用Java调用native式声明本
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式