jni开发中 接口为什么要冠extern "C"呢

android studio jni开发默认是C++语言的,而且还都是静态注册
  C++为了支持函数重载,函数在被C++编译后在符号库中的名字与C语言的不同。假如某个函数的原型为void f(int x, int y);该函数被C编译器编译后在符号库中的名字为_f,而C++编译器则会产生_f_int_int之类的名字。C++就是靠这种机制来实现函数重载的。 
  被extern “C”修饰的函数或者变量是按照C语言方式编译和链接的,所以可以用一句话来概括extern “C”的真实目的是实现C++与C的混合编程。我想编译的时候用的编译器是C++编译器一个编译器吧,只是编译器支持多种不同的编译模式罢了,这个不是重点.

那么,jni通过这种方式支持重载的java native函数吗?特地做了个试验:

public class Config {
    static {
        System.loadLibrary("native-lib");
    }
    public static native void init(int code);
    public static native void init(int code,String name);
    public static native String getSign(String json);

}

extern "C" JNIEXPORT void JNICALL
Java_com_bbc_playnativec_Config_init(JNIEnv *env, jclass clazz, jint code) {
    std::string hello = "bbc config init, C++ pppp222";
    LOGE("code=%d,%s", code, hello.data());
}

发现C++中函数出现红线,提示错误不能编译了.说到底,jni入库还是C语言的,但本地的其他功能代码可以使用C++语言的特性来实现.

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值