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

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

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

通过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库调用》

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

时间: 2024-11-05 22:58:48

Android6.0 NDK 和 .So 之间的关系的相关文章

c++-C++ 6.0中goto语句和行号之间的关系是什么

问题描述 C++ 6.0中goto语句和行号之间的关系是什么 C++ 6.0语言中的行号是不是就相当于指针?怎么样把代码行转换为函数指针?有没有库函数的实现? 解决方案 goto语句和指针有什么关系?函数才相当于指针.你可以把代码拆分成很多函数. 解决方案二: 行号1-n 是左边那个显示第几行的吧 goto 语句跟他没关系 例如:goto 基本用法 main(){ int i=0; loop: i++; if(i>9) { printf("数大于9") }: else { got

总结java实现八大排序算法及之间的关系

8种排序之间的关系: 1, 直接插入排序 (1)基本思想:在要排序的一组数中,假设前面(n-1)[n>=2] 个数已经是排 好顺序的,现在要把第n个数插到前面的有序数中,使得这n个数 也是排好顺序的.如此反复循环,直到全部排好顺序. (2)实例 (3)用java实现 [java] view plaincopy package com.njue; public class insertSort { public insertSort(){ inta[]={49,38,65,97,76,13,27,

UIView的alpha、hidden和opaque属性之间的关系和区别[转]

UIView的alpha.hidden和opaque属性之间的关系和区别 作者:wangzz 原文地址:http://blog.csdn.net/wzzvictory/article/details/10076323 转载请注明出处   UIView的这几个属性让我困惑了好一阵子,通过翻看官方文档和stackoverflow等网上资源,对它们有了一定理解,现分享出来.如理解有误,还请大家指出.   一.alpha 液晶显示器是由一个个的像素点组成的,每个像素点都可以显示一个由RGBA颜色空间组成

XML和数据库之间的关系

xml|数据|数据库  1.0 简介    本论文简要的探讨了XML和数据库之间的关系,同时列出一些可以使用数据库处理XML文档的软件. 虽然这里不打算详尽地介绍这些软件,但是笔者希望它能够描述使用数据库处理XML文档中的主要部分.这里有点偏向与关系数据库,因为我的经验如此.     2.0 XML是数据库吗?     在开始讨论XML和数据库之前,我们需要回答一个萦绕在很多心头的问题: "XML是数据库吗?"在严格意义上将,如果"XML"是指XML文档时,答案是&

JS、DOM和JQuery之间的关系示例分析

 这篇文章主要介绍了JS.DOM和JQuery之间的关系,对此概念不是特别清楚的朋友可以参考下 DOM(document object model) 其实是浏览器内元素对象的一个总称    我们用JavaScript对网页进行的所有操作都是通过DOM进行的.DOM属于浏览器,而不是JavaScript语言规范里的规定的核心内容,所以如果你下载一个JavaScript语言的参考帮助文档来查的话,就连妇孺皆知的document.write方法也找不到.    文档对象模型(Document Obje

常见Web技术之间的关系,你了解多少?

摘要:本文主要探讨了Web开发技术之间的关系,以及他们组合起来到底有什么用的问题. 如果你是一个Web开发初学者,那么你难免会在网上搜索HTML, CSS, XML, JS(Javascript), DOM, XSL等等这些词的意思,然而,随着学习的深入.当你把他们搅在一起,你又糊涂了,你会不停的问,HTML是什么?CSS是什么?XML是什么?JS是什么?它们到底有什么用?无论是网络百科,还是一些IT专题网站,又或者一些牛人博客,他们都会告诉你,某个单一的东西是什么,这类文章很多,但很少有涉及,

创建Oracle数据库、数据库名与实例名与SID之间的关系(图文详解)

目录 目录 软件环境 前言 安装Oracle监听程序 启动停止监听程序 创建数据库 数据库名db_name 数据库实例名instance_name 数据库名与实例名的关系 操作系统环境变量ORACLE_SID 软件环境 操作系统 RHEL 6.1 软件环境 Oracle10gr2 前言 在上一篇RHEL6.1 安装 Oracle10gr2 (图文.解析)中记录了如何成功的在RHEL6.1安装Oracle10gr2,但是在安装的过程中没有创建数据库,本篇主要记录了如果创建数据库和监听程序. 安装O

比特币私钥、公钥、钱包地址之间的关系

比特币交易涉及到很多密码学知识:公钥.私钥.哈希.对称加密.非对称加密.签名等等.那么哪些是需要用户认真保管不能对外泄露的,那些是需要用户公开的呢?先从钱包地址的生成说起. 1. 首先使用随机数发生器生成一个『私钥』.一般来说这是一个256bits的数,拥有了这串数字就可以对相应『钱包地址』中的比特币进行操作,所以必须被安全地保存起来. 2. 『私钥』经过SECP256K1算法处理生成了『公钥』.SECP256K1是一种椭圆曲线算法,通过一个已知『私钥』时可以算得『公钥』,而『公钥』已知时却无法

c二维数组名与指针的指针之间的关系

问题描述 c二维数组名与指针的指针之间的关系 int arr[3][4]; 书上说arr是指针的指针. 但是有点问题,为什么arr和arr[0]的值是一样的. 如果它是指针的指针的话,那么arr应该在一个内存空间1中存着arr[0]的地址,这个内存空间也有自己的地址. 但是这个内存空间的地址却与内存空间中存着的地址是相同的... 解决方案 arr的值本身是二维数组的首地址,它存储的内容也是数组的首地址 printf("%p %p ", arr, *arr);// 这2个值一样,它存储的