专栏名称: 刘望舒
腾讯云最具价值专家
目录
相关文章推荐
复利大王  ·  高盛新人Banker上班,用鼠标被上司骂破防 ·  3 小时前  
复利大王  ·  北大“韦神”粉丝超千万,家属回应牙齿缺失 ·  3 小时前  
鸿洋  ·  Android×鸿蒙×AI ... ·  昨天  
复利大王  ·  某一线女网红下海? ·  2 天前  
51好读  ›  专栏  ›  刘望舒

Android系统源码分析-JNI

刘望舒  · 掘金  · android  · 2018-02-01 11:19

正文

请到「今天看啥」查看全文


  • 在名称前面加上 Java_。

  • 描述与顶级源目录相关的文件路径。

  • 使用下划线代替正斜杠。

  • 删掉 .java 文件扩展名。

  • 在最后一个下划线后,附加函数名。

按照这些规则,此示例使用的函数名为 Java_com_example_hellojni_HelloJni_stringFromJNI 。 此名称描述 hellojni/src/com/example/hellojni/HelloJni.java 中一个名为 stringFromJNI()的 Java 函数。我们想通过更简单的方式,让写native函数如同和写java函数没有这一步的转化,那么可以通过javah来实现。

javah -d ../jni -jni com.chenjensen.myapplication.MainActivity
  • d :头文件输出目录

  • jni:生成jni文件

根据Javah生成的头文件,实现相应的native函数

JNIEXPORT jstring JNICALL Java_com_chenjensen_myapplication_MainActivity_helloWorld  (JNIEnv *, jobject);

头文件中生成了我们的java文件中定义的native方法,也做好了类型转化,我们只需要新建一个cpp文件来实现相应的方法即可。

cpp文件

JNIEXPORT jstring JNICALL Java_com_chenjensen_myapplication_MainActivity_helloWorld        (JNIEnv *env, jobject){    char *str = "Hello world";    return (*env).NewStringUTF(str);}

build文件中编译支持指定的平台(arm,x86等)

ndk {     moduleName "hello"            abiFilters "armeabi", "armeabi-v7a", "x86" }

这里指定了生成so文件的name之后,编译系统就会从JNI目录下去寻找相应的c/cpp文件,来生成相应的so文件。

执行

在Java代码中,native方法的执行之前,要提前加载相应的动态库,然后才可以执行,一般会在该类中通过静态代码块的方式来加载。应用启动时,调用此函数以加载 .so 文件。







请到「今天看啥」查看全文