Android NDK开发入门

网上一大堆的都是使用javah命令来生成头文件来完成JNI编写,但其实ADT集成NDK后,点点鼠标就可以了,懒人方法网上介绍很少,这边主要讲懒人JNI开发。

对于ADT配置NDK,请个人google或查看Android developer,这边不多做介绍。

1. 新建一个Android工程,我这边取名为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. 之后就是懒人操作了,在工程上右击鼠标,选择Android Tools->Add Native Support...

之后查看工程里面有两个文件

第一个是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。

时间: 2025-01-01 21:37:43

Android NDK开发入门的相关文章

【转】Android NDK开发入门实例

写这个,目的就是记录一下我自己的NDK是怎么入门的.便于以后查看,而不会忘了又用搜索引擎一顿乱搜.然后希望能够帮助刚学的人入门. 先转一段别人说的话: “NDK全称:Native Development Kit. 1.NDK是一系列工具的集合. * NDK提供了一系列的工具,帮助开发者快速开发C(或C++)的动态库,并能自动将so和java应用一起打包成apk.这些工具对开发者的帮助是巨大的. * NDK集成了交叉编译器,并提供了相应的mk文件隔离CPU.平台.ABI等差异,开发人员只需要简单修

Android NDK开发入门实例

AndroidNDK是能使Android应用开发者把从c/c++编译而来的本地代码嵌入到应用包中的一系列工具的组合. 注意: AndroidNDK只能用于Android1.5及以上版本中. I. Android NDK 目标: Android虚拟机允许你的应用在源码中通过JNI调用本地代码(c/c++)中实现的方法们.概括起来,这表示: --你的应用的java源代码中要声明一个或多个方法,这些方法前面需有'native'关键字,这表明它们被本地代码实现.如: [java] view plainc

下面就介绍下Android NDK的入门学习过程(转)

为何要用到NDK? 概括来说主要分为以下几种情况: 1. 代码的保护,由于apk的java层代码很容易被反编译,而C/C++库反汇难度较大. 2. 在NDK中调用第三方C/C++库,因为大部分的开源库都是用C/C++代码编写的. 3. 便于移植,用C/C++写得库可以方便在其他的嵌入式平台上再次使用. 下面就介绍下Android NDK的入门学习过程: 入门的最好办法就是学习Android自带的例子, 这里就通过学习Android的NDK自带的demo程序:hello-jni来达到这个目的. 一

Android Wear 开发入门

大家好,我是陆嘉杰,我是一名Android开发者.我想和大家进行一些技术交流,希望越来越多的人能和我成为好朋友. 大家都知道,智能手表是下一个开发的风口,而这方面的技术又属于前沿,所以和大家分享下Android Wear的开发流程. 首先,我推荐大家使用Android Studio来进行Wear的开发,这也是谷歌推荐的,本次讲授过程也将以Android Studio作为开发集成环境进行. 下面我们来创建Android Wear项目. 请注意,Android Wear项目中同时包含mobile和w

Android NDK开发篇(五):Java与原生代码通信(数据操作)

尽管说使用NDK能够提高Android程序的运行效率,可是调用起来还是略微有点麻烦.NDK能够直接使用Java的原生数据类型,而引用类型,由于Java的引用类型的实如今NDK被屏蔽了,所以在NDK使用Java的引用类型则要做对应的处理. 一.对引用数据类型的操作 尽管Java的引用类型的实如今NDK被屏蔽了,JNI还是提供了一组API,通过JNIEnv接口指针提供原生方法改动和使用Java的引用类型. 1.字符串操作 JNI把Java的字符串当作引用来处理,在NDK中使用Java的字符串,须要相

Android NDK 开发(三)--常见错误锦集合Log的使用【转】

转载请注明出处:http://blog.csdn.net/allen315410/article/details/41826511  Android NDK开发经常因某些因素会出现一些意想不到的错误,很多时候调试这些错误的时候,显得比调试Java代码要复杂,一方面是导致错误的原因很多很杂,另一方面NDK开发涉及到C/C++代码的编写,很多程序员对此不熟悉.那么这篇博客就总结一下,在NDK开发中经常出现的一些问题,并且尝试提供一些正确的解决方案,方便在开发时能够快速定位到错误,更改错误,当然了,错

Android NDK 开发

NDK全称:Native Development Kit. 1.NDK是一系列工具的集合. * NDK提供了一系列的工具,帮助开发者快速开发C(或C++)的动态库,并能自动将so和java应用一起打包成apk.这些工具对开发者的帮助是巨大的. * NDK集成了交叉编译器,并提供了相应的mk文件隔离平台.CPU.API等差异,开发人员只需要简单修改mk文件(指出"哪些文件需要编译"."编译特性要求"等),就可以创建出so. * NDK可以自动地将so和Java应用一起

C++开发安卓、windows下搭建Android NDK开发环境

1. NDK(Native Development Kit) 1.1 NDK简介 Android NDK是一套允许开发人员使用本地代码(如C/C++)进行Android APP功能开发的工具,通过这个工具,我们可以把用C/C++代码编译成可以直接运行在Android平台上的本地代码,这些本地代码以动态链接库( *.so )的形式存在,也正因为这样,我们可以通过复用这些动态链接库从而复用本地代码. 那么,通过NDK这个开发工具包,那么我们是否可以将一个APK完全使用C/C++来编写呢? 答案是不可

Android NDK 开发(四)java传递数据到C【转】

转载请注明出处:http://blog.csdn.net/allen315410/article/details/41845701 前面几篇文章介绍了Android NDK开发的简单概念.常见错误及处理和从第一个Hello World开始实际做一个简单的JNI开发示例,相信看完之后,大家对NDK开发有了一个概念上的认识了,那么接下来我们需要再深入一下NDK的开发,我们知道NDK开发就是使用JNI这层“协议”在Java和C之间起个“桥梁”的作用,将Java和Native C之间联立起来,让Java