android studio NDK demo详解

1,首先,要有android studio 2.2及以后版本。
2,生成NDK的demo,点这里
3,如果你成功运行了项目,那么应该猜的差不多了,那个native-lib.cpp就是一个c++文件,Cmake是c++的编译器。下面代码的意思也就是根据cMakeList.txt编译native-lib.cpp,当然是gradle帮我们调的cmake。

    externalNativeBuild {
        cmake {
            path "CMakeLists.txt"
        }
    }

4,下面我们来解释下这个native-lib.cpp里的函数

extern "C" {
JNIEXPORT jstring

JNICALL
Java_com_wan_ndk_MainActivity_stringFromJNI(
        JNIEnv *env,
        jobject /* this */) {
    std::string hello = "Hello from C++";
    return env->NewStringUTF(hello.c_str());
}

首先,extern 是C++关键字,extern “C”意思是按C语言编译

其次,JNIEnv是一个与线程相关的变量,不同线程的JNIEnv彼此独立(每个线程都有自己的方法栈)。与之相似的JavaVM是虚拟机在JNI层的代表,在一个虚拟机进程中只有一个JavaVM(JavaVM就是Java解释器进程)。我们要用到很多它提供的方法。

再次,Java_com_wan_ndk_MainActivity_stringFromJNI这个函数名就是这么命名的。

最后,jobject 如果native方法不是static的话,这个obj就代表调用这个方法的对象实例如果native方法是static的话,这个obj就代表这个调用native方法的类的class。

5.我们看了一下命名,这个应该在函数按报名和类命名,公用的方法怎么办,每个都写一个吗,当然不是了,我们这样

public class Util {
    static {
        System.loadLibrary("native-lib");
    }

    public static native String publicString2(String name);
}

然后我们只要调Util的方法就行了,大家也发现我传了一个String类型的参数,会生成什么呢

JNIEXPORT jstring JNICALL
Java_com_wan_ndk_Util_publicString2(JNIEnv *env, jclass type, jstring name_) {
    const char *name = env->GetStringUTFChars(name_, 0);
    std::string hello = "util hello";
    hello = hello.append(name);

    return env->NewStringUTF(hello.c_str());
}

这个方法作用很简单了,就是拼接字符串,这里要说的是java中每个基本类型都用JNI中对应的类型。而且像这个函数
env->GetStringUTFChars(name_, 0);和env->NewStringUTF(hello.c_str());
可以看到JNIEnv 提供了很多类型转换的函数。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值