概述
java 调用C
一般不调用C++
先定义一个Java类,
然后声明一个方法,添加关键字native表示是在C++中实现的
然后再C++中声明一个函数,函数需要有extern “C”声明,不然无法通过函数名找到入口
c++的函数对命名:必须是Java_包名(名称中所有“.”都替换成“_")_函数在Java中声明的文件名(也是类名)_java中的函数名
C++函数的参数:JNIEnv* env, jobject thiz,这两个是必须的参数,放在最前面,其他参数根据要跟java的声明保持一致
一下是类型对应表:
Java类型 | 本地类型 | JNI中定义的别名 |
int | long | jint |
long | _int64 | jlong |
byte | signed char | jbyte |
boolean | unsigned char | jboolean |
char | unsigned short | jchar |
short | short | jshort |
float | float | jfloat |
double | double | jdouble |
Object | _jobject* | jobject |
String | jobject | jstring |
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类型 | 对应的签名 |
boolean | Z |
byte | B |
char | C |
shrot | S |
int | I |
long | L |
float | F |
double | D |
void | V |
Object | L用/分割包的完整类名; 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调用的
最后
以上就是明理玫瑰为你收集整理的java与C函数相互调用整理的全部内容,希望文章能够帮你解决java与C函数相互调用整理所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复