java与C函数相互调用整理

来源:互联网 发布:win10网络图标灰色的 编辑:程序博客网 时间:2024/04/29 23:18

java 调用C

一般不调用C++

先定义一个Java类,

然后声明一个方法,添加关键字native表示是在C++中实现的

然后再C++中声明一个函数,函数需要有extern “C”声明,不然无法通过函数名找到入口

c++的函数对命名:必须是Java_包名(名称中所有“.”都替换成“_")_函数在Java中声明的文件名(也是类名)_java中的函数名

C++函数的参数:JNIEnv* env, jobject thiz,这两个是必须的参数,放在最前面,其他参数根据要跟java的声明保持一致

一下是类型对应表:

    Java类型                本地类型                 JNI中定义的别名    intlongjintlong_int64jlongbytesigned charjbytebooleanunsigned charjbooleancharunsigned shortjcharshortshortjshortfloatfloatjfloatdoubledoublejdoubleObject_jobject*jobjectStringjobjectjstring

jstring的使用需要做一些处理之后才能使用

JniHelper提供了相应的方法

static std::string jstring2string(jstring str);

static const char* jstring2pStr(jstring str);

实际的调用方式就是在java中调用java中的函数声明即可

c++调用Java:

一般是调用静态方法

具体代码如下:

JniMethodInfo t;//声明一个方法描述

if( JniHelper::getStaticMethodInfo(t, "com/game/jni", "callFun", "(ZZ)V") )

//第二个参数是方法所在的java目录,也就是java文件的包名/文件名,中间所有的"."换成"/"

//第三个参数是方法名

//第四个参数是(参数类型...)返回类型

//参数以及返回类型声明如下

    Java类型     对应的签名booleanZbyteBcharCshrotSintIlongLfloatFdoubleDvoidVObjectL用/分割包的完整类名;  Ljava/lang/String;Array[签名       [I       [Ljava/lang/String;

{

t.env->CallStaticVoidMethod( t.classID, t.methodID, isLandScape, isFixed );

//这个函数用来调用java静态方法,前两个参数是固定的,其他参数直接传入即可,但是如果使用了字符串之类的,需要转换为jstring之后再做参数传入

//带返回值的调用CallStaticObjectMethod,其他类型的调用可以参考jni .h的声明

/调用/t.env->NewStringUTF(”“)即可得到jstring对象,这种对象需要手动释放本地引用计数

//如下调用t.env->DeleteLocalRef

t.env->DeleteLocalRef( t.classID );

// t.classID 也是需要释放的对象

}


PS:需要注意的是,java要调用C++代码,必须先调用System.loadLibrary()加载相应的C++库。并且java只能调用已经加载过得库中的方法。如果在c++库运行时动态加载其他的c++库,这个另外加载的库中的函数是无法被java调用的




0 0