俗话说好记性不如赖笔头,其实就想做个笔记,方便以后查看。ndk的开发入门实例网上已经多如牛毛,我也受益多多,在次感谢前辈们贡献时间来和大家分享技术。但是有时即使照搬源码,程序还是跑不起来,各种莫名其妙的bug接踵而至,相信大家颇有感受。其实我们遇到的95%以上的问题肯定有人已经遇到过,想必也有解决之道。只要大家多用google,问题肯定能完美解决。
一、开发环境(windows)
1.运行环境(JDK,SDK,ADT),想必大家已经Ok
2.解压NDK压缩包,配置环境变量。将解压的地址写入环境变量PATH中
官方下载地址:http://developer.android.com/index.html
3.在命令提示符下输入ndk-build如果弹出如下的错误,而不是说ndk-build not found,就说明ndk 环境已经安装成功了。特别提示一下,搜索引擎中会告诉一些早期的NDK版本的使用,是在命令提示符下输入build/host-setup.sh;但是NDK经过更新,这个文件已经没有了。只需要输入 ndk-build就可以了。
Android NDK: Could not find application project directory !
Android NDK: Please define the NDK_PROJECT_PATH variable to point to it.
/home/braincol/workspace/android/android-ndk-r5/build/core/build-local.mk:85: *** Android NDK: Aborting . Stop.
4. c/c++编译器
推荐两种:cygwin和mingw32
建议使用mingw32,比较小并且安装简单不易出错误。
二、开发步骤
1.新建android工程android_superior_0022_JNI,工程目录如下:
2.本地调用代码JNITest类
为了更清楚就把代码放封装到一个类里面了, Activity里面只需要new JNITest().getTest();
JNITest.java代码:
package com.test.jni; public class JNITest { /** * Called when the activity is first created. */ static { //testNDK是 libtestNDK.so类库的前缀 ,lib不用写. System.loadLibrary("testNDK"); } public native String getTest(); }
3.编译本地代码类为.class文件,生成.h文件要用到
dos命令行进入工程的src目录,执行命令:javac com\test\jni\JNITest.java
生成的.class文件和.java文件放在一起,生成.h文件之后class文件即可删除。
4.工程目录下新建jni文件夹用于存放.c和Android.mk文件夹
文件夹名称自定义,建议使用jni命名,后面会有说明。
5.生成.h文件,存放于jni目录
在C/C++文件编写之前,需要利用javah这个工具生成相应的.h文件,然后根据这个.h文件编写相应的C/C++代码。然后该文件就没什么 用了可以删除。
dos命令行进入工程src目录,执行命令: javah -d ../jni com.test.jni.JNITest
-d ../jni:指定.h文件的存放目录
com.test.jni.JNITest:.class文件的完全限定名(包名+类名)
com_test_jni_JNITest.h文件:(包名+类名)
/* DO NOT EDIT THIS FILE - it is machine generated */ #include <jni.h> /* Header for class com_test_jni_JNITest */ #ifndef _Included_com_test_jni_JNITest #define _Included_com_test_jni_JNITest #ifdef __cplusplus extern "C" { #endif /* * Class: com_test_jni_JNITest * Method: GetTest * Signature: ()Ljava/lang/String; */ JNIEXPORT jstring JNICALL Java_com_test_jni_JNITest_GetTest (JNIEnv *, jobject); #ifdef __cplusplus } #endif #endif
6.根据.h文件编写c或者c++文件放于jni目录下
JNITest.c文件:
#include<jni.h> #include<string.h> jstring Java_com_test_jni_JNITest_GetTest (JNIEnv* env, jobject thiz) { return (*env)->NewStringUTF(env, "Hello Test NDK !"); }
7.编写Android.mk文件放于jni目录下
Android.mk文件:
LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE := testNDK LOCAL_SRC_FILES := JNITest.c include $(BUILD_SHARED_LIBRARY)
8.生成.so文件
mingw32进入到工程根目录:cd /var/e/xxx/android_superior_0022_JNI
执行:ndk-build
即可生成相应的库libs/armeabi/libtestNDK.so
9.测试结果
重新运行工程,把so文件打包到apk,即可看到屏幕的结果.
三、问题解答
1.*** non-numeric second argument to `wordlist' function: ''. Stop
Invalid attribute name: package /e/android/android-tool/android-ndk-r8e/build/gmsl/__gmsl:512: *** non-numeric second argument to `wordlist' function: ''. Stop.解决办法:
ndk目录\build\gmsl\_gmsl.xml文件的512行替换为下面的一行:
int_encode = $(__gmsl_tr1)$(wordlist 1,$(words $1),$(__gmsl_input_int))
2.Android NDK: Your APP_BUILD_SCRIPT points to an unknown file: ./jni/Android.mk
Invalid attribute name: package /e/android/android-tool/android-ndk-r8e/build/core/add-application.mk:128: Android NDK: WARNING: APP_PLATFORM android-14 is larger than android:minSdkVersion i n ./AndroidManifest.xml Android NDK: Your APP_BUILD_SCRIPT points to an unknown file: ./jni/Android.mk /e/android/android-tool/android-ndk-r8e/build/core/add-application.mk:165: *** A ndroid NDK: Aborting... . Stop.
这个问题的原因主要是第五行的部分。上面曾提到过要使用jni命名文件夹,用于存放.c和 Android.mk文件,否则就会出现上面的问题。
解决办法:
1.使用jni命名文件夹
参考文章:
相关推荐
这是一个ndk入门实例,使用eclipse实现的,很简单且具有参考意义 参考黄书《Android应用安全防护和逆向分析》第二章Android NDK开发2.1.1节以及百度经验 Android NDK入门开发实例...
android ndk 开发入门小例子。 博客地址http://blog.csdn.net/u014702653/article/details/51861013
该资源包含了一个androidndk的开发环境搭建,和简单的入门实例!简单易懂
1.了解NDK,Android NDK带来什么 2.环境部署Windows xp Android NDK环境搭建 3.Ubuntu android NDK配置与开发 4.Android1.5 NDK Release 1 中文...8.实例分析与入门实例NDK自带实例分 9.NDK入门开发实战Ubuntu版本析
通过大量实例全面讲解了Android开发中的核心知识点: Android UI、常见控件和自定义控件、碎片、四大组件(Activity、Service、Broadcast和ContentProvider)、二维绘制、Canvas和Paint、多媒体开发等; 还...
新加坡人写的介绍Anroid上用ndk开发native应用的实例教程。全书以实例为纲,适合新手入门。压缩包中附带实例的源代码。
Android 开发从入门到精通 新版Android开发教程及笔记-完整版 《Android中文教程》中文版 《android基础教程合集》 Android实例教程 会员贡献索引贴 实用Android开发工具和资源精选 APK权限大全 - Android必懂知识...
通过大量实例全面讲解了Android开发中的核心知识点: Android UI、常见控件和自定义控件、碎片、四大组件(Activity、Service、Broadcast和ContentProvider)、二维绘制、Canvas和Paint、多媒体开发等; 还...
通过大量实例全面讲解了Android开发中的核心知识点: Android UI、常见控件和自定义控件、碎片、四大组件(Activity、Service、Broadcast和ContentProvider)、二维绘制、Canvas和Paint、多媒体开发等; 还...
通过大量实例全面讲解了Android开发中的核心知识点: Android UI、常见控件和自定义控件、碎片、四大组件(Activity、Service、Broadcast和ContentProvider)、二维绘制、Canvas和Paint、多媒体开发等; 还...
android studio 中 进行 JNI 开发的一个简单实例,入门demo
通过大量实例全面讲解了Android开发中的核心知识点: Android UI、常见控件和自定义控件、碎片、四大组件(Activity、Service、Broadcast和ContentProvider)、二维绘制、Canvas和Paint、多媒体开发等; 还...
巧,android_jni操作指南,Android_NDK开发实例,Android_RIL层剖析(官方翻译),Android2.2+API+中文文档系列,Android的 Message机制(简单小结). Android的主题和风格介绍,Android开发环境搭建,Android内存泄露调试,...
巧,android_jni操作指南,Android_NDK开发实例,Android_RIL层剖析(官方翻译),Android2.2+API+中文文档系列,Android的 Message机制(简单小结). Android的主题和风格介绍,Android开发环境搭建,Android内存泄露调试,...
第10节:Android NDK入门.zip 第11节:Android NDK深入理论讲解.zip 第12节:Android NDK深入实例演示.zip 第13节:Android NDK深入实例演示2.zip 第14节:Android NDK深入实例演示3.zip 二、Android系统移植: 第...
之前从未涉猎过游戏开发,但知道游戏开发前要挑选一款合适的游戏引擎,自己从头开始敲代码的时代已经out了。在寻觅游戏引擎之前,我需要回答三道摆在我面前的选择题: 1、2D引擎还是3D引擎? 2、平台专用引擎还是...