专栏名称: 刘望舒
腾讯云最具价值专家
目录
相关文章推荐
鸿洋  ·  Android×AI ... ·  6 小时前  
复利大王  ·  黄小姐又来搞事情? ·  8 小时前  
复利大王  ·  六年级已成早恋重灾区了? ·  8 小时前  
复利大王  ·  张艺谋最好的电影解禁了 ·  8 小时前  
复利大王  ·  有业主不想还房贷了? ·  昨天  
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 文件。







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


推荐文章
复利大王  ·  黄小姐又来搞事情?
8 小时前
复利大王  ·  六年级已成早恋重灾区了?
8 小时前
复利大王  ·  张艺谋最好的电影解禁了
8 小时前
复利大王  ·  有业主不想还房贷了?
昨天
读书小分队  ·  分手见人品
8 年前
青春国航  ·  听说有女神,穿越千年,美在国航~
8 年前
每天学点做饭技巧  ·  这么销魂的家常菜,第一道就能征服你的胃!
8 年前