`
zkf_2010
  • 浏览: 8344 次
  • 性别: Icon_minigender_1
  • 来自: 河南
社区版块
存档分类
最新评论
阅读更多

       俗话说好记性不如赖笔头,其实就想做个笔记,方便以后查看。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命名文件夹

 

 

   参考文章:

   Android NDK开发入门实例

   Android程序编译原理之浅析

 

 

分享到:
评论

相关推荐

    eclipse NDK入门实例

    这是一个ndk入门实例,使用eclipse实现的,很简单且具有参考意义 参考黄书《Android应用安全防护和逆向分析》第二章Android NDK开发2.1.1节以及百度经验 Android NDK入门开发实例...

    Android NDK入门 实例 详解

    Android NDK(Native Development Kit)是Google为Android平台提供的一个工具集,允许开发者使用C/C++等原生...学习过程中,记得查阅官方文档,理解NDK的最新特性和最佳实践,同时不断练习以提升自己的NDK开发技能。

    android ndk开发实例代码

    这个"android ndk开发实例代码"提供了一个入门级的示例,帮助开发者理解NDK和JNI(Java Native Interface)的结合使用。 JNI是Java平台的标准部分,它为Java代码提供了调用本地(非Java)代码的能力。在Android开发...

    NDK从入门到精通CSDN

    ### NDK从入门到精通 #### 一、NDK简介 **NDK(Native Development Kit)**是Android平台提供的一种工具包,它允许开发者使用C或C++来编写应用程序的一部分,从而实现对底层硬件的直接访问和高性能计算任务的处理...

    ndk jni实例源码

    本实例源码"hellojni"是一个典型的NDK和JNI的入门示例,它将帮助我们理解如何在Android项目中集成和使用本地代码。 1. **NDK**:NDK是一套工具集,它提供了编译、构建和运行原生代码的环境。通过NDK,开发者可以在...

    AndroidNDK入门项目实战

    本资源提供了一个Android NDK入门项目实战,通过实例帮助初学者理解和掌握NDK的使用。 ### 1. NDK基础知识 - **NDK的用途**:主要用在需要高效计算或使用C/C++库的场景,如音频视频处理、游戏开发、加密算法等。 -...

    android NDK 开发总结

    6. 其他资源的提及:文档提到了一本关于Android开发的书《Google Android开发入门与实战》,这本书由靳岩和姚尚朗编写,由人民邮电出版社出版。书中不仅包含了小型案例,还包括了5个完整的商业实例及源码分析,这为...

    adt-bundle JNI NDK 初学者实例

    `adt-bundle`则是一个包含了Android开发工具集的下载包,包括Eclipse IDE和ADT(Android Developer Tools),它是初学者入门Android开发的重要资源。 首先,我们来详细解释一下`adt-bundle`。`adt-bundle`是Google...

    androidndk环境搭建和入门教程

    本教程将指导你如何搭建Android NDK环境,并通过简单的入门实例开始你的NDK开发之旅。 首先,我们来看“Android NDK开发环境搭建”。在Windows系统上,你需要下载适合你操作系统的NDK版本,通常可以从Android开发者...

    Android应用源码史上最强NDK入门项目实战-IT计算机-毕业设计.zip

    本项目以"Android应用源码史上最强NDK入门项目实战"为题,旨在为IT计算机专业的学生提供一个深入理解Android NDK开发的实践平台,特别适合于毕业设计和论文研究。 1. **NDK基础** NDK是Google提供的一个开源工具,...

    史上最强NDK入门项目实战.zip

    本项目实战通过一系列实例,深入浅出地讲解了NDK在Android开发中的应用。 首先,NDK的核心功能包括: 1. **性能优化**:对于计算密集型任务,如图形处理、物理模拟或加密算法,C/C++代码通常比Java更快,因此使用...

    android+NDK 开发.pdf

    文档还提到了一本书籍——《Google Android开发入门与实战》,这本书对于初学者来说非常有用,因为它不仅介绍了Android的基本概念和技术,还提供了大量的实际案例分析。以下是该书的一些亮点: - **最新SDK支持**:...

    史上最强NDK入门项目实战(实用1).zip

    4. **本地库的创建和使用**:NDK开发中,我们会创建静态库或动态库。理解静态库(.a)和动态库(.so)的区别,以及何时选择使用它们是至关重要的。此外,还会讲解如何在Android项目中引用这些本地库。 5. **性能优化**...

    安卓Android源码——史上最强NDK入门项目实战.zip

    本项目实战将带你深入理解Android NDK,并通过实例帮助你掌握其核心概念。 一、NDK概述 NDK提供了一套工具集,用于编译原生代码,生成可以在Android设备上运行的本地库。这些本地库可以被Java层调用,以利用C/C++的...

    Android studio编译NDK实例

    在Android开发领域,NDK(Native Development Kit)是一个不可或缺的工具,它允许开发者使用C和C++编写原生代码,从而提升应用性能,特别是在处理计算密集型任务或使用硬件加速时。本实例“Android Studio编译NDK...

    史上最强NDK入门项目实战毕业设计—(包含完整源码可运行).zip

    2. **NDK开发环境搭建**: - 安装SDK和NDK:首先需要安装Android Studio,然后通过内置的SDK Manager下载NDK组件。 - 配置环境变量:设置系统环境变量,确保可以命令行调用NDK工具。 3. **JNI(Java Native ...

    android NDK入门篇----混合使用java和c/c++代码 源码工程

    本项目是一个关于Android NDK入门的实例,展示了如何混合使用Java和C/C++代码。我们将深入探讨这个主题,了解其关键概念、步骤以及实际应用。 首先,NDK的主要目的是为Android应用提供原生代码支持。原生代码通常比...

    NDK_Sample_HelloWorld

    《Android NDK开发入门:HelloWorld实例详解》 在Android应用开发中,除了常见的Java语言,我们还可以利用NDK(Native Development Kit)进行C++或C语言的原生代码编程,以实现性能优化或者调用特定硬件功能。本文...

    Android Studio JNI编程入门实例

    通过以上步骤,你已经成功实现了Android Studio中的JNI编程入门。然而,这只是基础,实际开发中可能需要处理更复杂的情况,如多线程、内存管理、错误处理等。同时,CMakeLists.txt作为现代的构建系统,提供了更多...

Global site tag (gtag.js) - Google Analytics