首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往
您找到你想要的搜索结果了吗?
是的
没有找到

NDK学习笔记(1)——第一个jni程序

新建项目 新建一个项目: 注意点选include c++ support,因为AS对c语言的支持不够好,如果不选直接创建jni项目虽然可以运行但是某些地方会被标注为红色且无法使用提示功能。...因为我们选择了支持c++,所以local.properties里自动添加了相关代码 ndk.dir=D\:\\toolSoftwore\\androidSDK\\ndk-bundle sdk.dir=D...\:\\toolSoftwore\\androidSDK 如果只是普通的项目,需要添加ndk.dir=D:\toolSoftwore\androidSDK\ndk-bundle。...add_library( # 这个是声明引用so库的名称,在项目中,如果需要使用这个so文件,引用的名称就是这个。...java的包名和方法名拼接而成 * @para JNIEnv 是一个线程相关的结构体指针,可以用来调用本地函数 * @para jobject 当前对象的指针 */ jstring Java_com_ndkdemo_ustc_jnitest_MainActivity_stringFromJNI

67140

Android JNI(一)——NDK与JNI基础

,线程相关结构,线程相关结构指向JNI函数指针数组,这个数组中存放了大量的JNI函数指针,这些指针指向了详细的JNI函数。...JNIEnv结构.png 2.7、与JNIEnv相关的常用函数 2.7.1 创建Java中的对象 jobject NewObject(JNIEnv *env, jclass clazz,jmethodID...返回值是Java字符串对象,如果无法构造该字符串,则为null。 那有没有一个直接直接new一个utf-8的字符串的方法呢?...最常见的引用类型,基本上通过JNI返回来的引用都是局部引用,例如使用NewObject,就会返回创建出来的实例的局部引用,局部引用值在该native函数有效,所有在该函数中产生的局部引用,都会在函数返回的时候自动释放...和局部应用不同的是,没有俺么多函数能够创建全局引用

2K32

【错误记录】Android NDK 错误排查记录 ( java.lang.UnsatisfiedLinkError: dalvik.system.PathClassLoader )

项目时记录下的版本信息 ; 1 ....Gradle 及插件 , 编译之前配置的 NDK 代码的配置方式 , 代码依赖库 , 构建脚本等 , 需要修改 ; ③ 纯源码开发 : 使用 C/C++ 源码开发肯定是没问题的 ; ④ 引用外部函数库...: 如果引用外部的函数库 , 如第三方静态库或动态库 , 其中的配置 , 预编译选项 , 构建脚本 , 可能支持情况就不太一样了 , 使用一些不太适合的 Gradle 版本可能无法编译通过 , 或编译出的版本无法运行...; ⑤ 当前交叉编译 CPU 架构选择 : 该 NDK 项目引用了外部的静态库 , 和头文件 , 需要配置预编译选项 , 但是在 Ubuntu 中只交叉编译了 armeabi-v7a CPU 架构的静态库...; ⑥ 建议交叉编译 CPU 架构选择 : 最新的 Gradle 和 Gradle 插件 , 编译的应用 , 必须在 Ubuntu 中交叉编译时 , 为各种 CPU 架构都编译出对应的函数库 ;

52610

Android NDK开发扫盲及最新CMake的编译使用

官方文档分别从以下几个方面介绍了 NDK NDK 的基础概念 如何编译 NDK 项目 ABI 是什么以及不同 CPU 指令集支持哪些 ABI 如何使用您自己及其他预建的库 本节将会对文档进行总结和补充。...Java的跨平台特性导致其本地交互的能力不够强大,一些和操作系统相关的特性Java无法完成,于是Java提供了jni专门用于和本地代码交互,这样就增强了Java语言的本地交互能力。...比如指定使用c++11还是c++14编译,会引用哪些共享库,并描述关系等,还会指定编译的 abi。只有有了这些 NDK 中的编译工具才能准确的编译 c/c++ 代码。...(其实官方文档中大部分都是的,并没有使用 CMake) 幸运的是, Github上的官方示例 里面有个项目 hello-libs 实现了如何创建出静态库/动态库,并引用它。...[Google Samples] 当你发现示例里的一些NDK配置满足不了你的需求后,你就需要到 CMake 官方文档 去查询完整的支持的函数,同时这里也提供一个中文翻译的简易的CMake手册。

2.1K30

Android NDK开发完全剖析

这些工具我们应该学会怎么使用,但是它并不能支持我们深入学习音视频技术,很多跨平台和使用广泛的库都是C/C++的,所以NDK开发是音视频技术学习的“门槛”,本文的目的就是带你从0开始开始学习NDK相关的知识点...当然交叉编译也可以使用NDK提供的独立工具链,现在已经很少谈到独立工具链了,但是对于一些大型的项目,独立工具链还是有它独特的优势的,因为独立工具链真的很灵活。...,JavaVM与进程强相关,Android程序下一个进程只能有一个JavaVM对象,JavaVM提供了一系列接口函数。...全局引用/局部引用: 传递给原生方法的每个参数,以及 JNI 函数返回的几乎每个对象都属于“局部引用”。这意味着,局部引用在当前线程中的当前原生方法运行期间有效。...获取全局引用的方法是通过NewGlobalRef和NewWeakGlobalRef函数,我们在JNI的开发中,将局部引用作为参数得到调用NewGlobalRef得到全局引用

1.7K10

Android C++ 系列:NDK 减少 so 库体积方法总结

最终编译的动态库有几十个,单架构动态库大小有几十兆,之前在 Iot 设备中勉强跑着,但是这个体积对于手机应用来说是致命的,各个模块费事费力能优化个几 K 的体积就不错了,我这直接给上个几十兆的,APP 平台方肯定无法接受...所以只要对函数加上这个宏,像这样: // JNIEXPORT就是控制可见的宏// JNICALL在NDK这里没有什么意义,只是个标识宏JNIEXPORT void JNICALL Java_ClassName_MethodName...◆ STL 的使用方式 对于 C++的 library,引用方式有 2 种: 静态方式(static) 动态方式(shared) 其中,静态方式在编译时会将用到的相关代码直接复制到目的文件中;而动态方式则会将相关的代码打成...由于编译器在编译时并不能知道所有被引用的地方,所以同时会打入了很多不相关的代码。 所以,如果项目引用 library 的函数较多时,用动态方式可以避免多次拷贝,节省空间。...(1)typeid:返回指针或引用所指对象的实际类型。 (2)dynamic_cast:将基类类型的指针或引用安全的转换为派生类型的指针或引用

1.5K30

Android NDK开发初试(基础)

Java的跨平台特效导致其本地交互的能力不够强大,一些和操作系统相关的特效Java无法完成,于是Java提供了 JNI专门用于和本地代码教会,这样就增强了 Java 语言的本地交互能力。...通过Java JNI,用户可以调用 C,C++等相关代码。 NDK是Android所提供的一个工具集合,通过NDK可以在Android中更加方便的通过JNI来访问本地代码,比如C或者C++。...Studio 3.5 现在我们想创建一个ndk项目,真的是简单很多,无需要太多的过程,直接创建即可。...编译过程中对函数的命名风格不同,这将导致 JNI 在链接时无法根据函数名查找到具体的函数,那么 JNI extern "C" 指定内部的函数采用C语言的命名风格来编译,否则当 JNI 采用C++...来实现时,由于 C 和 C++ 编译过程中对函数的命名风格不同,这将导致 JNI 在链接时无法根据 函数名找到具体的函数,那么JNI 调用就无法完成。

64920

NanoMsg框架|Android Studio编译NanoMsg源码

NDK项目中,我们通过C++调用编译好的NanoMsg的动态库,再利用JNI的方式JAVA或是Kotlin进行调用。...其实上面两步可以在一个NDK项目中实现,不过我采用的还是先编译好NanoMsg的动态库方式,如果说NanoMsg本身更新了,这样我们重橷编译一下新的源码生成相同名称的动态库即可,封装调用JNI这些就不用再动代码了...02 新建NDK项目 打开Android Studio新创建一个C++的项目,起名为makenanomsglib ? ?...CMakeLists文件 这一步是一个重点,在NanoMsg中的源码里有一个CMakiList的文件,我们如果直接拷过来替换自己的CMakeList是没用的,而且我们是要编译成动态库,所以里面部分内容我们需要引用...后面文章我们介绍一下C下面的Nano的相关函数和Android的调用与前面C#的通讯。 最近还是会把相关的Demo上传上来,敬请期待! 完

1.1K20

Android JNI学习(二)——实战JNI之“hello world”

本地内容主要简介如下: 1、环境展示 2、传统方式的具体流程 3、传统方式的相关问题 4、传统方式的so文件 5、通过CMake工具demo演示流程 6、CMake工具demo的背后原理 7、CMake...模拟器.png 二、传统方式的具体流程 具体流程如下: (一) 创建项目 首先在Android Studio创建一个Android项目,包名为gebilaolitou.ndkdemo (二) 创建引用本地库的工具类...PS:(此视图无法反应磁盘上的实际文件层次结构,而是将相似文件分到一组中,简化项目导航)。如果为Project模式则如下: ?...这个示例代码提供了一个简单的C++函数stringFromJNI(),此函数可以返回字符串“Hello from C++” 在 External Build Files 文件夹中:可以找到CMake或...应用就是可以使用库的原生函数stringFromJNI()。

2.1K42

jni基础

_NdkSimple */ // 用来打一个标记,c在编译的时候会把头文件 copy 到你引入的地方,不管是重复引用还是相互引用都只会 copy 一次 #ifndef _Included_com_darren_ndk12...还是 c++ 统一都是采用 c 的编译方式,因为在c里面是不允许函数重载的,但是在 c++ 里面可以 extern "C" { #endif /* * Class: com_darren_ndk12...JNICALL: 也是一个关键字,可以少的 jni call // JNIEnv: 这个是 c 和 java 相互调用的桥梁,所有 function 搞清 // jobject: java传递下来的对象,就是本项目中...JniSimple java 对象 // jclass: 静态函数的时候java传递下来的 class 对象,就是本项目中的 JniSimple.class JNIEXPORT jstring JNICALL...#endif struct JNIEnv_ { const struct JNINativeInterface_ *functions; // .... } 在实现的函数里面

71020
领券