JniHelper java和c++互相呼叫
阿新 • • 發佈:2019-01-23
假設兩邊檔案為:
JniUtil.cpp 和 Jutil.java
Jutil.java裡面 ---
包名為com.abc.game
方法:
public static void test1() {
// ….
}
public void test2() {
// ….
}
--
在JniUtil.cpp中呼叫java的方法
1. 呼叫靜態方法
JniMethodInfo minfo;
bool isHave = JniHelper::getStaticMethodInfo(minfo, "com/abc/game/Jutil", "test1", "()V");
if (isHave) {
minfo.env->CallStaticVoidMethod(minfo.classID, minfo.methodID);
}
2. 呼叫例項方法
JniMethodInfo minfo;
// 需要先獲取例項物件
bool isHave = JniHelper::getStaticMethodInfo(minfo, "com/abc/game/Jutil", "getInstance", "()Ljava/lang/Object;");
object job;
if (isHave) {
jobj = minfo.env->CallStaticObjectMethod(minfo.classID, minfo.methodID);
}
isHave = JniHelper::getMethodInfo(minfo, "com/abc/game/Jutil", "test2", "()V");
if (isHave) {
minfo.env->CallVoidMethod(jobj, minfo.methodID);
}
在Jutil.java中呼叫JniUtil.cpp的方法
在Jutil.java中宣告
private static native void test3(int i);
在JniUtil.cpp中定義
extern "C"
{
void Java_com_abc_game_Jutil_test3(JNIEnv *env, jobject thiz, jint a)
{
// ….
}
}
然後在Jutil.java中便可以呼叫
JniUtil.cpp 和 Jutil.java
Jutil.java裡面 ---
包名為com.abc.game
方法:
public static void test1() {
// ….
}
public void test2() {
// ….
}
--
在JniUtil.cpp中呼叫java的方法
1. 呼叫靜態方法
JniMethodInfo minfo;
bool isHave = JniHelper::getStaticMethodInfo(minfo, "com/abc/game/Jutil", "test1", "()V");
if (isHave) {
minfo.env->CallStaticVoidMethod(minfo.classID, minfo.methodID);
}
2. 呼叫例項方法
JniMethodInfo minfo;
// 需要先獲取例項物件
bool isHave = JniHelper::getStaticMethodInfo(minfo, "com/abc/game/Jutil", "getInstance", "()Ljava/lang/Object;");
object job;
if (isHave) {
jobj = minfo.env->CallStaticObjectMethod(minfo.classID, minfo.methodID);
}
isHave = JniHelper::getMethodInfo(minfo, "com/abc/game/Jutil", "test2", "()V");
if (isHave) {
minfo.env->CallVoidMethod(jobj, minfo.methodID);
}
在Jutil.java中呼叫JniUtil.cpp的方法
在Jutil.java中宣告
private static native void test3(int i);
在JniUtil.cpp中定義
extern "C"
{
void Java_com_abc_game_Jutil_test3(JNIEnv *env, jobject thiz, jint a)
{
// ….
}
}
然後在Jutil.java中便可以呼叫
test3(1);
如果是傳遞多引數或字串,如下
在Jutil.java中宣告
private static native void test3(int i, String s);
在JniUtil.cpp中定義
extern "C"
{
void Java_com_abc_game_Jutil_test3(JNIEnv *env, jobject thiz, jint i, jstring s)
{
// ….
const char *string = env->GetStringUTFChars(s, 0);
// use the string
evn->ReleaseStringUTFChars(s, string);
}
}
* 遇到error: base operand of '->' has non-pointer type 'JNIEnv {aka _JNIEnv}'
是因為'JNIEnv在c和c++下的巨集定義不同
把使用於c的語法:const char *string = (*env)->GetStringUTFChars(env, s, 0);
改為適用於c++的語法:const char *string = env->GetStringUTFChars(s, 0);