标签:jni编程
最新因工作需要,需要在C++的开发中使用到Java,所以就想到了利用JNI来进行开发,JNI全称Java Native Interface,也就是Java的本地接口,JNI既可以实现Java到本地平台的开发,也可以将本地平台的开发移植到Java上(当然,这里必须要保证二进制的位数一样,因为Java也是程序,JVM也是区分32位版本和64位版本的),下面就简单介绍一下JNI的双向操作,本文章以Java <----> C++的开发为例:
1.在Java中开发,使用C++的库
<1>在Java程序中使用C++,需要在类中声明C++的导出函数。
<2>将相应的动态库加载到Java程序中。
<3>将Java程序中的JNI函数使用javah来生成C/C++的头文件
public class Demo{
public static native int getSum(int x, int y);
public static native int getSub(int x, int y);
public static void main(String[] args){
System.loadLibrary("xxx");
//******这里需要注意的是不需要写动态库后缀
//******windows上默认是.dll,Linux上默认是.so
}
}
下面重点介绍JNI在C++中的开发
2.在C++中开发,使用Java的jar包
在C++中开发使用jar包,首先要确定咱们的C++程序是32位还是64位,因为这个决定了我们的程序应该使用32位
还是64位的jre(java runtime environment),java的运行程序jar包(其实也就是*.class是不区分32位和64位的),
<1>建立Java的虚拟机JVM
<2>将jar包作为JVM运行时的类,启动JVM的时候作为启动参数加入
<3>使用JVM的虚拟环境来查找类、查找类函数、查找域,调用函数,根据构造函数创建类对象
C++中在JVM中使用的几种环境
(1)创建一个类对象
jclass cls = env->FindClass("test/Demo");
jmethodID mid = env->GetMethodID(cls,"<init>","(Ljava/lang/String;)V");
const char szTest[] = "电信";
jstring arg = NewJString(env, szTest);
jobject demo = env->NewObject(cls,mid,arg);
(2)查找一个类
jclass cls = env->FindClass("test/Demo");
这里写类的路径的时候,将完整的类拷贝过来
然后将.改成/即可。例如com.example的类则写成
com/example
(3)查找方法ID
env->GetMethodID(cls,"<init>","(Ljava/lang/String;)V");
特别要注意的是由于这里是构造函数所以使用的是
<init>,其他的类函数则使用相应的函数名称,
特别要注意的是函数的签名,千万最好是从jar包中查看
或者通过javap -s 解析*.class来查看签名,如果手写有时候
容易写错
(4)调用方法
env->CallObjectMethod(demo, mid);
调用的函数根据返回值类型不同而不同
Call###Method,其中###是基本类型或Object
由于String从Object派生,所以String也调用该函数
(5)查找域ID
env->GetStaticFieldID(classID,fieldname,sig)
env->GetBoolFieldID
env->GetObjectFieldID
env->Get###FieldID
这里特别需要注意的有两点
1>如果是静态变量则第一个参数传入类指针,否则传入对象指针
2>除了基础类型以外,其他的均为GetObjectFieldID
(6)获取域值
env->GetStaticObjectField(classPtr, fieldID)
env->GetBooleanField(objectPtr, fieldID)
env->GetObjectField(objectPtr, fieldID);
规则与查找域的前两条一致
(7)调用带参数的构造函数
jclass cls = env->FindClass("test/Demo");
jmethodID mid = env->GetMethodID(cls,"<init>","(Ljava/lang/String;)V");
const char szTest[] = "电信";
jstring arg = NewJString(env, szTest);
jobject demo = env->NewObject(cls,mid,arg);
//验证是否构造成功
mid = env->GetMethodID(cls, "getMessage","()Ljava/lang/String;");
jstring msg = (jstring)env->CallObjectMethod(demo, mid);
cout<<JStringToCString(env, msg);
详情查阅官方文档
http://docs.oracle.com/javase/1.5.0/docs/guide/jni/spec/functions.html#wp4517
创建JVM的Demo
标签:jni编程
原文地址:http://blog.csdn.net/davidsu33/article/details/39182017