【转】Android用NDK和整套源码下编译JNI的不同
原文网址:http://www.devdiv.com/android_ndk_jni_-blog-99-2101.html
前些天要写个jni程序,因为才几行代码,想着用ndk开发可能容易些,就先研究了下。不过最终我的代码虽然只有几行,但需要libdl,因为用到了dlopen一类的函数,只能又换到用android源码体系下编译。
不过两个都用了下,就发现了些不同。我其实并不能确定这些是不是实际存在的差异的,我只是拿ndk的sample和我见到的android源码里的jni代码做的比较
1. ndk支持的库很少,所以用以前最好先看看自己需要的功能是不是已经包括了,省得白忙活。不过人家是有解释的,说ndk里有的库才是稳定的,其它的建议你不要用。嗯,google总是这一套说辞,不公开的api也是。至于要看android源码中多了哪些库,make modules后grep一下lib开头的应该就是了,不过也不是所有都能用啦。
2. 注册函数的方法是不同的。举例说,我在com/evan129/jnitest/jniutils.java有个native int foo()方法,需要在jni中实现
在ndk中,你只要实现这个函数,然后函数名是以jint java_com_evan129_jnitest_jniutils_foo(jnienv* env, jobject thiz) 命名既可。也就是说,如果你的jni只要实现这个函数,并且功能也很简单的话,那么你的jni c/cpp文件里只需要这一个函数就完事了。
但在android源码中编译jni代码是不同的,jni中的函数名无所谓。不过你至少还需要加一个
jniexport jint jnicall jni_onload(javavm* vm, void* reserved)方法,这个方法你可以找个现有的复制一把就行,检查运行环境的。然后主要是这个方法中会调用(*env).registernatives函数,在这里把jni中的方法和java文件中的方法关联起来。
看起来像是ndk自动补上了这部分工作,我并不清楚原理啦。
3. 有个很诡异的区别,自动传入的jnienv* env好像不是一个东西。因为在android源码中使用这个env一般是如env->newstringutf(…),而ndk中sample里的一处是(*env)->newstringutf(…) 这env和*env差很大吧。但两处函数传入的都是jnienv* env,我只能怀疑jnienv的定义是不是都是不同的。
末了,就是说下我这个很简单的jni折腾了我两天的一个问题。如前所说,我是用android源码来编译的,自己在packages/app/下建了pinyinjni工程,下面有个jni目录,每次直接用mmm packages/app/pinyinjni/jni来编译。jni目录下的android.mk中指定的名字是这样的local_module := libpinyin 每次编译都很顺利,生成了libpinyin.so。但是我在java文件里,system.loadlibrary(“libpinyin”)总是失败。感谢paranoia@newsmth帮我解决了这个问题,告诉我在loadlibrary时用”pinyin”。但是,这个事情实在太奇怪了,那文件名是libpinyin.so啊,而且我在这里用/data/data/…/libpinyin.so这种完整路径也会失败,我以前虽然没写过jni,但调用过,用完整路径指定jni so文件应该不会有问题的。或者,从另一个角度想,如果我local_module的名字不是用lib开头的,那它调用时应该用什么名字?这个”lib”前缀又是哪步删除的?我没有多做测试了,但是猜想ndk中应该是没有这种诡异的问题的。
【转】Android用NDK和整套源码下编译JNI的不同相关推荐
- 源码下编译APK,却是总是提示,找不到符号:SystemProperties 。。。
>>>>>在DeskClock下任意一个java文件中,import android.os.SystemProperties;然后添加user库,将layoutlib.j ...
- android源码下编译apk内无so,Android源码编译反思
[初步构想] 如果是在一台PC上先完整的编译一次Android源码,然后将整个编译好的源码移到另一台PC,然后再在移到的PC上编译,这样估计是可以减少时间的吧? [初步测试] 初步测试结果,很令我感动 ...
- Android 编译过程介绍,Android.mk 和 Android.bp 分析, 在源码中编译 AndroidStudio 构建的 App
目录 一.Android 编译 1. 编译流程 2. Soong 介绍 3. build.sh 二.Android.mk 解析 三.Android.bp 解析 1. 模块类型 2. 模块属性 四.An ...
- android 10.0 在系统源码下生成jks系统签名文件
在系统开发中,会遇到在app在线升级的时候,会升级失败,由于app自己用自己的签名文件签名的 所以会和系统签名文件不一样,导致会出现一些问题 所以为了解决这一个问题 就得使用系统生成的签名文件 给ap ...
- Android Studio 创建的app放到Android 源码下编译
文章目录 环境 步骤 创建一个Android Studio 新项目 编写编译脚本 Android.mk Android.bp 环境 Android Studio版本: Android Studio D ...
- android11源码下编译一个可执行程序
程序a.cpp: #include <iostream> using namespace std; int main() {cout << "123456789&qu ...
- 面部表情识别3:Android实现表情识别(含源码,可实时检测)
面部表情识别3:Android实现表情识别(含源码,可实时检测) 目录 面部表情识别3:Android实现表情识别(含源码,可实时检测) 1.面部表情识别方法 2.人脸检测方法 3.面部表情识别模型训 ...
- Android MP3录音功能(能暂停,含源码,可编译)
项目需求ios和Android客户端要使用录音功能,格式要求为mp3,一直百度都找不到MP3录音的源码,国外也只能找到相关说明,却也没有找到源码, 最多也就只找到编译好的so文件,也没有例子,使用说明 ...
- android系统源码7.1.2_r8下载,编译,运行到nexus5X上,修改源码并编译SDK进行测试
一,学习android系统源码下载,编译的作用 1,可以自己 DIY 自己的rom系统,从系统层面,宏观的加深理解 android系统 2,编译自己的 userdebug(原生root权限) rom, ...
最新文章
- 数据同步的终极解决方案,阿里巴巴开源的Canal框架当之无愧!!
- sdut 1479 数据结构实验之栈与队列九:行编辑器
- 学生使用计算机中怎么关机,学会正确开关机初中计算机教案
- Cassandra集群配置
- 神奇的判断数组名和指针的区别
- 谈谈互金跟银行里数据逻辑的差异
- 手机通讯录c语言导入手机软件,有什么软件能快速将手机通讯录的联系人传到另一个手机上...
- 概率论与数理统计【一】- 随机事件与概率(1):古典概型与几何概型
- 跑跑卡丁车rush服务器维护,跑跑卡丁车Rush+测试服
- 科学精神:谈登月,关键在于讨论技术如何实现
- 管理感悟:计划是给谁看的
- ViewPage实现一屏多页面显示(进阶版)
- vs2013设置winp#cap开发环境
- lisp 定距等分_CAD点命令快捷键(定数等分及定距等分)
- python爬虫、爬取百度图片保存到本地
- 更新Windows 11后,桌面狂闪,没有显示图标,鼠标指针一直在加载中,如何解决?
- Dev --gridView中CheckItem的多选设置
- HDU 5148 Cities
- 银行存管java 对接_Jay su-华正商务旅行社-4年中级java工程师-猿急送
- ngzorro 自定义指令操作 nz-table 列拖动缩放
热门文章
- 利用HttpWebRequest和HttpWebResponse做黑客注射工具
- vba 操作html,VBA IE对象的操作方法
- echarts 饼图移动端_VUE移动端项目中使用Echart
- c++语言代码游戏,c++小游戏(贪吃蛇)源程序
- linux mint 19新功能,Linux Mint 19.3将在2019年12月正式发布,附新功能简介
- python function terminated un_Python: 僵尸进程的产生和清除方法
- flex java 全局拦截_Flex CSS阻止底层内容
- 2020年进入倒计时:一波前端资源送给你~这一年,谢谢自己!
- 前端之路:平凡中的小事,有点鸡汤的感觉哟!
- java abs在哪个包,Java StrictMath abs()方法