Android中Java调用C++代码的另一种写法

一般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类型对应签名符号
IntegerI
ShortS
CharC
LongJ
FloatF
DoubleD
ByteB
BooleanZ
VoidV
数组[内部类型
Object对象L开头,包名/类名,”;”结尾,$标识嵌套类
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值