java与c 函数互调方法,java与C函数相互调用整理

本文详细介绍了Java如何调用C/C++代码的过程,包括在Java中声明native方法,C++中实现函数,以及参数类型和函数命名的规则。还提到了C++调用Java静态方法的示例,并强调了需先调用System.loadLibrary加载库。在调用过程中,涉及的JNI函数如CallStaticVoidMethod和NewStringUTF等也在文中提及。
摘要由CSDN通过智能技术生成

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调用的

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值