一般Android调用C++都是使用模板给出的代码:
public class NativeMethod{
// Used to load the 'native-lib' library on application startup.
static {
System.loadLibrary("native-lib");
}
public native String stringFromJNI();
}
然后cpp/native-lib.cpp中:
extern "C" JNIEXPORT jstring JNICALL
Java_com_test_MainActivity_stringFromJNI(JNIEnv *env,jobject obj) {
std::string hello = "Hello from C++";
return env->NewStringUTF(hello.c_str());
}
然后今天本来想搞一下C++中调Java方法,结果搞了半天发现另外一种Java调用C++的方法;
当然我们首先感谢大佬:大佬博客
然后我们上代码:
#define NELEM(x) ((int) (sizeof(x) / sizeof((x)[0])))
#define NATIVE_METHODS_PATH "com/test/NativeToJava"
static JNINativeMethod mNativeMethods[] = {
{"toastUtil", "(Ljava/lang/String;)V", (void **) Android_JNI_Toast}
};
JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM *vm, void *pVoid) {
JNIEnv *jniEnv;
javaVM = vm;
if (vm->GetEnv(reinterpret_cast<void **>(&jniEnv), JNI_VERSION_1_6) != JNI_OK) {
return JNI_ERR;
}
jclass nativeMethodClass = jniEnv->FindClass(NATIVE_METHODS_PATH);
jniEnv->RegisterNatives(nativeMethodClass, mNativeMethods, NELEM(mNativeMethods));
jniEnv->DeleteLocalRef(nativeMethodClass);
return JNI_VERSION_1_6;
}
static void Android_JNI_Toast(JNIEnv *jniEnv, jobject jobject1, jstring msg_) {
const char *msg = jniEnv->GetStringUTFChars(msg_, NULL);
LOGE("%s 难道是Java调用C++的另外一种方式???", msg);
jniEnv->ReleaseStringUTFChars(msg_, msg);
}
Java方法中直接使用native方法,不需要再loadLibrary了:
public class NativeToJava {
public native void toastUtil(String msg);
}
new NativeToJava().toastUtil("不会吧???");
另外附一张转换表:
Java类型 | 对应签名符号 |
Integer | I |
Short | S |
Char | C |
Long | J |
Float | F |
Double | D |
Byte | B |
Boolean | Z |
Void | V |
数组 | [内部类型 |
Object对象 | L开头,包名/类名,”;”结尾,$标识嵌套类 |