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