【转】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的不同的更多相关文章
- 在Android源码下编译jni所需要知道的事~
以下只是自己的一些总结,欢迎讨论 通过NDK编译jni网上有很多例子,在这我只总结在Android源码下编译 1.android源码环境下编译so包,编出来的.so的包前面不会自动给添加lib,NDK ...
- 【转】Android 源码下利用jni编译自己的项目(参考系统development/samples/SimpleJNI)
原文网址:http://blog.csdn.net/qiuxiaolong007/article/details/7860481 记于正文前:环境是ubuntu10.10,android 源码是2.0 ...
- android 隐藏API 在源码下编译报错cannot find symbol symbol
应该是我对android 不熟悉的缘故,今天使用源码编译了一个调用了隐藏api的应用程序始终报错: cannot find symbol symbol : class IPackageInstall ...
- Android源码下编译APK步骤
1.进入android源码目录下的build下执行:source envsetup.sh 后继续在该路径下执行lunch. 2.编写完成工程 3.编写Android.mk文件,放入工程目录下 ...
- 【Android 系统开发】CyanogenMod 13.0 源码下载 编译 ROM 制作 ( 手机平台 : 小米4 | 编译平台 : Ubuntu 14.04 LTS 虚拟机)
分类: Android 系统开发(5) 作者同类文章X 版权声明:本文为博主原创文章 ...
- Android Small插件化框架源码分析
Android Small插件化框架源码分析 目录 概述 Small如何使用 插件加载流程 待改进的地方 一.概述 Small是一个写得非常简洁的插件化框架,工程源码位置:https://github ...
- android应用商店完整版源码
这个是从一个安卓学习的网站上转载过来的,android应用商店完整版源码,大家可以看看一下吧. _op><ignore_js_op> <ignore_js_op>< ...
- Android版的疯狂猜图游戏源码完整版分享
这个游戏源码是在安装教程网那么分享过来的,Android版的疯狂猜图游戏源码完整版分享,也是本人之前很早以前发的一款游戏源码的,大家如果想了解一下,可以看看吧,不说多了,上一个图先吧. > ...
- 多种的android进度条的特效源码
多种的android进度条的特效源码,这个源码是在源码天堂那个网站上转载过来的,我已经修改一部分了,感觉很实用的,大家可以学习一下吧,我就不上传源码了,大家可以直接到那个网站上下载吧. 源码天堂下载地 ...
随机推荐
- 【转】深圳FAE,想拿高薪还缺什么?
原文网址:http://www.eefocus.com/KTHR_IC/blog/11-05/222793_e04c8.html KT老胡您好! 我07年本科毕业在一家医疗民营企业从事了3年多的嵌入式 ...
- 页面onclick()中传值问题
html中onclick()里面传变量到javascript中的问题,小小的记录下: 传变量的话一定要加 '' <span onclick="sellGoods('${session ...
- hdu 5410 CRB and His Birthday(混合背包)
Problem Description Today is CRB's birthday. His mom decided to buy many presents for her lovely son ...
- javascript正則表達式 "\b"问题
preface 昨晚在看<javascript权威指南>后.看见作者自己封装一个兼容全部浏览器的山寨HTML5新API classLIst类.自己想了想认为自己也要去玩一下.可是能力还是有 ...
- C++——try、throw、catch实例学习程序
#include<iostream> #include<stdexcept> //exception/stdexcept/new/type_info头文件里都有定义的标准异常类 ...
- Microsoft Visual Studio 产品密钥
Microsoft Visual Studio 2010 产品密钥:YCFHQ-9DWCY-DKV88-T2TMH-G7BHP Microsoft Visual Studio 2013 产品密钥:BW ...
- React-nwb的使用
一.查看nwb的版本 nwb -v 二.创建一个react项目 nwb new react-app react-demo 三.启动项目 nwb serve
- VPN错误789:L2TP连接尝试失败
VPN 错误789:l2tp 连接尝试失败,因为安全层在初始化与远程计算机的协商时遇到一个处理错误 Windows配置VPN,选择“使用IPsec的第2层隧道协议(L2TP/IPSec)”时, XP系 ...
- kafka的一些常用命令
启动zookeeper bin/zookeeper-server-start.sh config/zookeeper.properties & 启动kafka bin/kafka-server ...
- OC基础 可变数组与不可变数组的使用
OC基础 可变数组与不可变数组的使用 1.不可变数组 1.1不可变数组的创建 //实例方法 NSArray *array = [[NSArray alloc] initWithObjects:&quo ...