使用互联网有很多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. ERROR 2003 (HY000): Can&#39;t connect to MySQL server on &#39;10.16.115.101&#39; (111)

    ubuntu安装之后mysql,使用apt-get安装命令,默认为同意只本地访问 root@idata1:~/software# mysql -uroot -p123456 -h10.16.115.1 ...

  2. 《Java并发编程实战》第二章 线程安全 札记

    一个.什么是线程安全 编写线程安全的代码 其核心是管理国事访问的操作. 共享,可变的状态的訪问 - 前者表示多个线程訪问, 后者声明周期内发生改变. 线程安全性 核心概念是正确性.某个类的行为与其规范 ...

  3. KMP算法(转)

    KMP算法 在介绍KMP算法之前,先介绍一下BF算法. 一.BF算法 BF算法是普通的模式匹配算法,BF算法的思想就是将目标串S的第一个字符与模式串P的第一个字符进行匹配,若相等,则继续比较S的第二个 ...

  4. hdoj 1506&amp;&amp;1505(City Game) dp

    // l表示从l[i]到i连续大于a[i]的最远左区间.r表示从i到r[i]连续大于a[i]的最远又区间 DP 找出 a[i] 的最远左区间和最远右区间与自己连着的比自己大的数的长度 , 然后用这个长 ...

  5. UNIX网络编程卷1 server编程范式0 迭代server

    本文senlie原版的.转载请保留此地址:http://blog.csdn.net/zhengsenlie 1.迭代 TCP server总是在全然处理某个客户的请求后才转向下一个客户. 2.从进程控 ...

  6. hdu4717 The Moving Points 三分法

    题意:坐标系上有n个点,每个点的坐标和移动方向速度告诉你,速度方向都是固定的.然后要求一个时刻,使得这个时刻,这些点中最远的距离最小. 做法:三分法,比赛的时候想不到.考虑两个点,如果它们走出来的路径 ...

  7. Java Main如何被执行?(转)

    java应用程序的启动在/hotspot/src/share/tools/launcher/java.c的main()函数中,而在虚拟机初始化过程中,将创建并启动Java的Main线程.最后将调用JN ...

  8. SqlServer发送邮件,定时作业

    今天偶然研究了一下sqlserver发送邮件的功能,之前听说过可以发,但是一直没尝试过,只是用C#写后台程序的方式来发邮件. 现在又多了一种发送邮件的途径. 大致的步骤如下: 1.配置sqlserve ...

  9. 省前训练...Orz

    A. 异形卵 Time Limit: 1000ms Memory Limit: 128000KB 64-bit integer IO format:      Java class name: Sub ...

  10. 利用修改div的位置+js对象存储div信息 实现简单的div自定义布局功能

    原文:利用修改div的位置+js对象存储div信息 实现简单的div自定义布局功能 利用修改div的位置+js对象存储div信息 实现简单的div自定义布局功能1.在界面上添加几个checkbox和一 ...