使用互联网有很多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进入发展的更多相关文章

  1. Android NDK debug 方法

    最近又频繁遇到 NDK 的错误,记录一下debug调试的一些经验,以备后续查看 一般来说,在Android Studio中的Monitor中将过滤器的 LOG TAG 设置为 "DEBUG& ...

  2. Android NDK开发Hello Word!

    在之前的博客中已经为大家介绍了,如何在win环境下配置DNK程序,本篇我将带大家实现一个简单的Hello jni程序,让大家真正感受一下NDK开发的魅力.这里我们选择使用C+JAVA开发Android ...

  3. Android NDK开发初识

    神秘的Android NDK开发往往众多程序员感到兴奋,但又不知它为何物,由于近期开发应用时,为了是开发的.apk文件不被他人解读(反编译),查阅了很多资料,其中有提到使用NDK开发,怀着好奇的心理, ...

  4. android NDK debug 遇到的问题与解决方法

    最近在研究android  NDK 的eclipse调试,遇到点问题,总结一下: 1.Unknown Application ABI :在application.mk里面添加APP_PLATFORM ...

  5. 初识Android NDK

    本文介绍Windows环境下搭建Android NDK开发环境,并创建一个简单的使用Native代码的Android Application. 一.环境搭建 二.JNI函数绑定 三.例子 一.环境搭建 ...

  6. Android SDK Android NDK Android Studio 官方下载地址

    2016.12 Android Studio Windows Includes Android SDK https://dl.google.com/dl/android/studio/install/ ...

  7. Android NDK之JNI陷阱

    背景: 最近一个月一直在做移植库的工作,将c代码到share library移植到Android平台.这就涉及到Android NDK(native develop kit)内容.这里只想记录下JNI ...

  8. Android NDK开发

    Android NDK 开发教程(极客学院) 一.Android NDK环境搭建 使用最新ndk,直接抛弃cygwin,以前做Android的项目要用到NDK就必须要下载NDK,下载安装Cygwin( ...

  9. Eclipse+CDT+GDB调试android NDK程序(转)

    Eclipse+CDT+gdb调试android ndk程序 先介绍一下开发环境,在这个环境下,up主保证是没有问题的. ubuntu 11.10 eclipse 3.7(indego) for ja ...

随机推荐

  1. js实现鼠标拖拽div-------Day44

    假设去问这样一个问题"你认为鼠标操作简单,还是键盘操作简单",相信会有多数人都会回答鼠标吧,毕竟键盘button那么多,假设手小了或者手法不规范了,太easy出问题了,也对操作的速 ...

  2. Unity GUI选择与评价

    因为Unity内建的GUI不管是不是从开发效率或效率强制,因此,许多派生GUI插入,什么插件的选择,是一个非常值它被认为是. 既然是评价,就会有非常多的主观意识,这不一定成为选择的根据. 再比方.我已 ...

  3. Cocos2d-x 手机游戏《疯狂的蝌蚪》资源 “开源” win32+安德鲁斯+iOS三合一

    郝萌主倾心贡献,尊重作者的劳动成果,转载请注明出处 From郝萌主. 假设文章对您有所帮助.欢迎给作者捐赠,支持郝萌主,捐赠数额任意,重在心意^_^ 我要捐赠: 点击捐赠 Cocos2d-X源代码下载 ...

  4. Unity3d 网络编程(三)(Unity3d内置简单的网络server编制)

    使用Unity3d内置的网络建立一个简单的server.主机时,请使用机器.创建一个client连接到本机. watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv ...

  5. cocos2dx --- button点击放大中心

    自定义简单button,直接附着到代码: MenuItem* MenuItemNode::create( const char* normal,Ref* target,SEL_MenuHandler ...

  6. Android.mk中的经常使用语法

    Android.mk编译文件是用来向Android NDK描写叙述你的C,C++源码文件的, 今天查了一些经常使用的的语法. 一 概述: 一个Android.mk文件用来向编译系统描写叙述你的源码. ...

  7. hdu 1159 Common Subsequence (dp乞讨LCS)

    Common Subsequence Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Other ...

  8. UVA 1364 - Knights of the Round Table (获得双连接组件 + 二部图推理染色)

    尤其是不要谈了些什么,我想A这个问题! FML啊.....! 题意来自 kuangbin: 亚瑟王要在圆桌上召开骑士会议.为了不引发骑士之间的冲突. 而且可以让会议的议题有令人惬意的结果,每次开会前都 ...

  9. HDU 4916 Count on the path

    意甲冠军: 考虑到一棵树,m询价  不要求回答每一次询价u和v通过在两个节点形成的最低等级点路径 思路: 一開始以为是LCA-  只是T了好几次-  后来发现不用LCA也可做 考虑每一个询问u和v   ...

  10. hdu 4975 最大流问题解决队伍和矩阵,利用矩阵dp优化

    //刚開始乱搞. //网络流求解,假设最大流=全部元素的和则有解:利用残留网络推断是否唯一, //方法有两种,第一种是深搜看看是否存在正边权的环.见上一篇4888 //至少四个点构成的环,另外一种是用 ...