Android NDK进入发展
使用互联网有很多javah命令生成一个头文件来完成JNI写,但事实上ADT集成NDK后。点点鼠标就可以了,网上的介绍是非常小懒的方法,在这里,我们主要谈论的懒惰JNI发展。
为ADT组态NDK。请个人google或视图Android developer,不多做描述在这里。
1. 新建一个Androidproject,我这边取名为JNI_Learn,一键生成后代码片段例如以下:
public class JNI extends ActionBarActivity {
static{
System.loadLibrary("JNI_Learn");
}
public native int plus(int x, int y);
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_jni);
if (savedInstanceState == null) {
getSupportFragmentManager().beginTransaction()
.add(R.id.container, new PlaceholderFragment())
.commit();
}
Log.d("JNITest", "3+5=" + plus(3, 5));
}
高亮部分是我自己加入部分。简单解释一下。
loadLibrary的话,里面的名字稍后我会再标注一下,这边主要是native层生成的so库的名字,须要去掉lib前缀和.so后缀。
声明native方法要在訪问权限之后,其它声明之前,加一个native标记此方法实如今native层。
使用plus方法与正常使用无异。
2. 之后就是懒人操作了,在project上右击鼠标。选择Android Tools->Add Native Support...
之后查看project里面有两个文件
第一个是JNI_Learn.cpp,这个稍后详述。第二个是Android.mk。在Android编译中。都会寻找文件夹下是否存在Android.mk,然后依据这个文件进行编译。里面编写了详细的编译规则,打开文件后。内容例如以下:
LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_LDLIBS := -llog LOCAL_MODULE := JNI_Learn
LOCAL_SRC_FILES := JNI_Learn.cpp include $(BUILD_SHARED_LIBRARY)
除加红部分外,其它都为自己主动生成,加红部分是我加入为了使用native的log方法
当中LOCAL_PATH表示编译源文件的路径,LOCAL_LDLIBS表示编译模块时须要附加的连接器选项,LOCAL_MODULE表示终于编译出来模块的名称。LOCAL_SRC_FILES表示须要编译的源文件,include $(BUILD_SHARED_LIBRARY)表示终于编译成一个共享库文件。
3. 以下详细加入native层对plus方法的实现代码
#include <jni.h>
#include <android/log.h> #define LOG_TAG "JNITest"
//log func
//int __android_log_print(int prio, const char *tag, const char *fmt, ...) #define LOGD(...) __android_log_print(ANDROID_LOG_DEBUG, LOG_TAG, __VA_ARGS__) extern "C"
JNIEXPORT int Java_com_example_jni_1</span>learn_JNI_plus");
return x + y;
}
使用了Android log将log打印到了logcat一样。想了解的能够自行查阅相关知识,这边没太大关系。这个也是在Android.mk中为什么须要添加LOCAL_LDLIBS原因。
extern “C”是必需要加的,由于C++和C编译后的导出函数原型不同,java仅仅能call C类型的,所以需要将C++转化为C类型的。添加extern "C"声明。
JNIEXPORT声明他是一个导出函数。
方法名字必须以Java开头,然后包名和类名及方法名之间下划线隔开。假设不巧刚好你的包名中有下划线。那怎样处理JNI中java包名含下划线情况呢?在前面加一个“1”。
这么简单程序,遇到几个错误:
第一个是说JNI Load Library失败,由于apk中能够看到so是不是被压缩进去了(更改apk后缀为rar,解压rar能够看到有个lib目录内有这个so),我这边看到压缩进去了,结果还是载入失败。
原因在于loadLibrary的參数必需要不带前缀lib不加后缀.so才干够。
爆出undefined reference to。原因是因为我没有声明extern "C"。java找不到C++声明方式的。
还有就是包名中恰好出现下划线。比方JNI_Learn,须要更改为_1才干够规避。
还有就是使用LOG,必需要在Android.mk中添加LOCAL_LDLIBS。
版权声明:本文博客原创文章。博客,未经同意,不得转载。
Android NDK进入发展的更多相关文章
- Android NDK debug 方法
最近又频繁遇到 NDK 的错误,记录一下debug调试的一些经验,以备后续查看 一般来说,在Android Studio中的Monitor中将过滤器的 LOG TAG 设置为 "DEBUG& ...
- Android NDK开发Hello Word!
在之前的博客中已经为大家介绍了,如何在win环境下配置DNK程序,本篇我将带大家实现一个简单的Hello jni程序,让大家真正感受一下NDK开发的魅力.这里我们选择使用C+JAVA开发Android ...
- Android NDK开发初识
神秘的Android NDK开发往往众多程序员感到兴奋,但又不知它为何物,由于近期开发应用时,为了是开发的.apk文件不被他人解读(反编译),查阅了很多资料,其中有提到使用NDK开发,怀着好奇的心理, ...
- android NDK debug 遇到的问题与解决方法
最近在研究android NDK 的eclipse调试,遇到点问题,总结一下: 1.Unknown Application ABI :在application.mk里面添加APP_PLATFORM ...
- 初识Android NDK
本文介绍Windows环境下搭建Android NDK开发环境,并创建一个简单的使用Native代码的Android Application. 一.环境搭建 二.JNI函数绑定 三.例子 一.环境搭建 ...
- Android SDK Android NDK Android Studio 官方下载地址
2016.12 Android Studio Windows Includes Android SDK https://dl.google.com/dl/android/studio/install/ ...
- Android NDK之JNI陷阱
背景: 最近一个月一直在做移植库的工作,将c代码到share library移植到Android平台.这就涉及到Android NDK(native develop kit)内容.这里只想记录下JNI ...
- Android NDK开发
Android NDK 开发教程(极客学院) 一.Android NDK环境搭建 使用最新ndk,直接抛弃cygwin,以前做Android的项目要用到NDK就必须要下载NDK,下载安装Cygwin( ...
- Eclipse+CDT+GDB调试android NDK程序(转)
Eclipse+CDT+gdb调试android ndk程序 先介绍一下开发环境,在这个环境下,up主保证是没有问题的. ubuntu 11.10 eclipse 3.7(indego) for ja ...
随机推荐
- 给AspNetPager分页控件添加bootstrap样式
AspNetPager分页控件算是比较好用的一个分页控件了.想要结合bootstrap使用,官方代码入口 .pagination a[disabled]{ color: #777;cursor: no ...
- NIVC->IPR[IPADDR]
#include <stm32f10x.h> #include "sys.h" //表偏移地址 //NVIC_VectTab:基址 //Offset:偏移量 //C ...
- ServletRequest接口召回总结
<body> <form action="LoginServlet" method="post"> User:<input typ ...
- Mac下Jekyll安装
之前一直用Wordpress,虽然功能强大,各种插件各种bug,如果想弄个主题,折腾得要命.最近改用jekyll+gitHub免费空间.记录一下. 我用的是Mac,所以只讲述Mac下如何安装,Wind ...
- chrome扩展第三方浏览器下载安装
1.使用其他浏览器打开谷歌应用市场,复制扩展详情地址url 2. 粘贴到:http://chrome-extension-downloader.com/中进行扩展的下载. 3. 拖拽到chrome e ...
- Leetcode 动态规划 Candy
本文senlie原版的,转载请保留此地址:http://blog.csdn.net/zhengsenlie Candy Total Accepted: 16494 Total Submissions: ...
- ASP.NET MVC:Razor 引入命名空间
原文:ASP.NET MVC:Razor 引入命名空间 页面中引用 c# @using MvcApplication83.Models @using MvcApplication83.Common 行 ...
- SpringMVC + Spring 3.2.14 + Hibernate 3.6.10
SpringMVC + Spring 3.2.14 + Hibernate 3.6.10 集成详解 注:此文档只说明简单的框架集成,各个框架的高级特性未涉及,刚刚接触框架的新人可能需要参考其他资料. ...
- python 编码转换(转)
主要介绍了python的编码机制,unicode, utf-8, utf-16, GBK, GB2312,ISO-8859-1 等编码之间的转换. 常见的编码转换分为以下几种情况: 自动识别 字符串编 ...
- OCP读书笔记(23) - 题库(ExamC)
200.Which operation requires that you create an auxiliary instance manually before executing the ope ...