Android6.0 NDK 和 .So 之间的关系

简介: 一直有人来问JNI和so库之间的关系,之前很少写博客,也没时间,这里简单的写下,网上也有很多文章,这里阐述了如何编译过去,并且做了编译时需要注意的相关说明。还有一点需要特别强调,JNI可以理解为辅助ADC,真正要使用的是编译之后的.so,这里使用的是Android6.0,可以忽略。

一直有人来问JNI和so库之间的关系,之前很少写博客,也没时间,这里简单的写下,网上也有很多文章,这里阐述了如何编译过去,并且做了编译时需要注意的相关说明。

还有一点需要特别强调,JNI可以理解为辅助ADC,真正要使用的是编译之后的.so,这里使用的是Android6.0,可以忽略。

jni深圳市米奇云科技有限公司



通过NDK我们可以直接用JNI去动态编译,有2种方法:

  1. 我们通过手写的方式写出对应的方法
  2. 我们通过javah的命令执行出对应的.h

深圳市米奇云科技有限公司


如何,这里涉及到了Context和Toast,如何直接编译会报错。
这里需要注意2点

  1. javac的是时候要 -cp 带上android.jar的路径
  2. javah的时候要在根目录执行,-classpath带上android.jar的路径

编译通过的效果:

深圳市米奇云科技有限公司



无论是手写还是生成,对应的函数体是不会变的,无法就是在数据结构前加上J,代表着JNI,多了ENV和VM , 看上去也复杂了许多,但是大家不要畏惧,因为开发中有专门的人负责写这一层,上层只需要负责调用就可以了。

/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class com_example_hellojni_LogOpen */

#ifndef _Included_com_example_hellojni_LogOpen
#define _Included_com_example_hellojni_LogOpen
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     com_example_hellojni_LogOpen
 * Method:    getLog
 * Signature: ()Ljava/lang/String;
 */
JNIEXPORT jstring JNICALL Java_com_example_hellojni_LogOpen_getLog
  (JNIEnv *, jobject);

/*
 * Class:     com_example_hellojni_LogOpen
 * Method:    callShow
 * Signature: (Ljava/lang/String;)V
 */
JNIEXPORT void JNICALL Java_com_example_hellojni_LogOpen_callShow
  (JNIEnv *, jobject, jstring);

/*
 * Class:     com_example_hellojni_LogOpen
 * Method:    callToastShow
 * Signature: (Landroid/content/Context;Ljava/lang/String;)V
 */
JNIEXPORT void JNICALL Java_com_example_hellojni_LogOpen_callToastShow
  (JNIEnv *, jobject, jobject, jstring);

#ifdef __cplusplus
}
#endif
#endif



这里已经生成了.h文件,我们把它放入JNI文件夹中,Eclipse会自动帮我们编译成 .so 文件,前提是你需要设置好NDK的路径与Builder的设置,只要修改了,就会立即自动编译,当然,我设置的Builder选项就是立即编译的。


深圳市米奇云科技有限公司


默认是生成 armeabi 文件夹,代表了 ARM 的 CPU 。其它应用程序直接使用的话就只需引用这个so,这里的 .so 库是指定了类名和包名,所以使用的时候要注意匹配上,不然会报错。

最后调用下这个So库的方法,输出名字:

深圳市米奇云科技有限公司


当然,你也可以编写.cpp,这样可以用 env->FindClass("com/immqy/dujinyang/DuJNI"); 脱离类名的约束。

这里链接以前汇总的文章《android JNI的.so库调用》

版权声明:本文为博主杜锦阳原创文章,转载请注明出处。

相关文章
|
数据采集 编解码 Ubuntu
Android流媒体开发之路二:NDK C++开发Android端RTMP直播推流程序
Android流媒体开发之路二:NDK C++开发Android端RTMP直播推流程序
278 0
|
1月前
|
编译器 Android开发
配置环境变量,使CMakeLists.txt可直接使用Android NDK工具链编译项目
配置环境变量,使CMakeLists.txt可直接使用Android NDK工具链编译项目
|
2月前
|
Java Android开发 C++
🚀Android NDK开发实战!Java与C++混合编程,打造极致性能体验!📊
在Android应用开发中,追求卓越性能是不变的主题。本文介绍如何利用Android NDK(Native Development Kit)结合Java与C++进行混合编程,提升应用性能。从环境搭建到JNI接口设计,再到实战示例,全面展示NDK的优势与应用技巧,助你打造高性能应用。通过具体案例,如计算斐波那契数列,详细讲解Java与C++的协作流程,帮助开发者掌握NDK开发精髓,实现高效计算与硬件交互。
138 1
|
3月前
|
开发工具 Android开发
解决Android运行出现NDK at /Library/Android/sdk/ndk-bundle did not have a source.properties file
解决Android运行出现NDK at /Library/Android/sdk/ndk-bundle did not have a source.properties file
168 4
解决Android运行出现NDK at /Library/Android/sdk/ndk-bundle did not have a source.properties file
|
3月前
|
开发工具 Android开发
解决Android Studio编译提示NDK is missing a “platforms“ directory
解决Android Studio编译提示NDK is missing a “platforms“ directory
205 1
|
4月前
|
Java Android开发 C++
🚀Android NDK开发实战!Java与C++混合编程,打造极致性能体验!📊
【7月更文挑战第28天】在 Android 开发中, NDK 让 Java 与 C++ 混合编程成为可能, 从而提升应用性能。**为何选 NDK?** C++ 在执行效率与内存管理上优于 Java, 特别适合高性能需求场景。**环境搭建** 需 Android Studio 和 NDK, 工具如 CMake。**JNI** 构建 Java-C++ 交互, 通过声明 `native` 方法并在 C++ 中实现。**实战** 示例: 使用 C++ 计算斐波那契数列以提高效率。**总结** 混合编程增强性能, 但增加复杂性, 使用前需谨慎评估。
141 4
|
5月前
|
XML Java Android开发
Android Studio2.2 中支持NDK开发HelloJNI例子
Android Studio2.2 中支持NDK开发HelloJNI例子
34 0
|
6月前
|
Java 开发工具 Android开发
鸿蒙HarmonyOS 与 Android 的NDK有什么区别?
鸿蒙(HarmonyOS)和Android的NDK(Native Development Kit)是两个不同的概念,它们在设计理念、架构、开发方式和目标平台等方面存在着一些显著的不同。
330 0
|
6月前
|
传感器 Java 开发工具
[NDK/JNI系列03] Android Studio集成NDK开发环境
[NDK/JNI系列03] Android Studio集成NDK开发环境
66 0
|
6月前
|
Java Android开发 C++
安卓SO层开发 -- 第一个NDK项目
安卓SO层开发 -- 第一个NDK项目
39 0