原文网址: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的不同相关推荐

  1. 源码下编译APK,却是总是提示,找不到符号:SystemProperties 。。。

    >>>>>在DeskClock下任意一个java文件中,import android.os.SystemProperties;然后添加user库,将layoutlib.j ...

  2. android源码下编译apk内无so,Android源码编译反思

    [初步构想] 如果是在一台PC上先完整的编译一次Android源码,然后将整个编译好的源码移到另一台PC,然后再在移到的PC上编译,这样估计是可以减少时间的吧? [初步测试] 初步测试结果,很令我感动 ...

  3. Android 编译过程介绍,Android.mk 和 Android.bp 分析, 在源码中编译 AndroidStudio 构建的 App

    目录 一.Android 编译 1. 编译流程 2. Soong 介绍 3. build.sh 二.Android.mk 解析 三.Android.bp 解析 1. 模块类型 2. 模块属性 四.An ...

  4. android 10.0 在系统源码下生成jks系统签名文件

    在系统开发中,会遇到在app在线升级的时候,会升级失败,由于app自己用自己的签名文件签名的 所以会和系统签名文件不一样,导致会出现一些问题 所以为了解决这一个问题 就得使用系统生成的签名文件 给ap ...

  5. Android Studio 创建的app放到Android 源码下编译

    文章目录 环境 步骤 创建一个Android Studio 新项目 编写编译脚本 Android.mk Android.bp 环境 Android Studio版本: Android Studio D ...

  6. android11源码下编译一个可执行程序

    程序a.cpp: #include <iostream> using namespace std; int main() {cout << "123456789&qu ...

  7. 面部表情识别3:Android实现表情识别(含源码,可实时检测)

    面部表情识别3:Android实现表情识别(含源码,可实时检测) 目录 面部表情识别3:Android实现表情识别(含源码,可实时检测) 1.面部表情识别方法 2.人脸检测方法 3.面部表情识别模型训 ...

  8. Android MP3录音功能(能暂停,含源码,可编译)

    项目需求ios和Android客户端要使用录音功能,格式要求为mp3,一直百度都找不到MP3录音的源码,国外也只能找到相关说明,却也没有找到源码, 最多也就只找到编译好的so文件,也没有例子,使用说明 ...

  9. android系统源码7.1.2_r8下载,编译,运行到nexus5X上,修改源码并编译SDK进行测试

    一,学习android系统源码下载,编译的作用 1,可以自己 DIY 自己的rom系统,从系统层面,宏观的加深理解 android系统 2,编译自己的 userdebug(原生root权限) rom, ...

最新文章

  1. 数据同步的终极解决方案,阿里巴巴开源的Canal框架当之无愧!!
  2. sdut 1479 数据结构实验之栈与队列九:行编辑器
  3. 学生使用计算机中怎么关机,学会正确开关机初中计算机教案
  4. Cassandra集群配置
  5. 神奇的判断数组名和指针的区别
  6. 谈谈互金跟银行里数据逻辑的差异
  7. 手机通讯录c语言导入手机软件,有什么软件能快速将手机通讯录的联系人传到另一个手机上...
  8. 概率论与数理统计【一】- 随机事件与概率(1):古典概型与几何概型
  9. 跑跑卡丁车rush服务器维护,跑跑卡丁车Rush+测试服
  10. 科学精神:谈登月,关键在于讨论技术如何实现
  11. 管理感悟:计划是给谁看的
  12. ViewPage实现一屏多页面显示(进阶版)
  13. vs2013设置winp#cap开发环境
  14. lisp 定距等分_CAD点命令快捷键(定数等分及定距等分)
  15. python爬虫、爬取百度图片保存到本地
  16. 更新Windows 11后,桌面狂闪,没有显示图标,鼠标指针一直在加载中,如何解决?
  17. Dev --gridView中CheckItem的多选设置
  18. HDU 5148 Cities
  19. 银行存管java 对接_Jay su-华正商务旅行社-4年中级java工程师-猿急送
  20. ngzorro 自定义指令操作 nz-table 列拖动缩放

热门文章

  1. 利用HttpWebRequest和HttpWebResponse做黑客注射工具
  2. vba 操作html,VBA IE对象的操作方法
  3. echarts 饼图移动端_VUE移动端项目中使用Echart
  4. c++语言代码游戏,c++小游戏(贪吃蛇)源程序
  5. linux mint 19新功能,Linux Mint 19.3将在2019年12月正式发布,附新功能简介
  6. python function terminated un_Python: 僵尸进程的产生和清除方法
  7. flex java 全局拦截_Flex CSS阻止底层内容
  8. 2020年进入倒计时:一波前端资源送给你~这一年,谢谢自己!
  9. 前端之路:平凡中的小事,有点鸡汤的感觉哟!
  10. java abs在哪个包,Java StrictMath abs()方法