热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Android个人心得:超详细的JNI(NDK)入门与使用

步骤0:环境搭建(参考Android-图像识别项目OpenCV(1):技术选型以及NDK搭建)步

步骤0:环境搭建(参考Android-图像识别项目OpenCV(1):技术选型以及NDK搭建)

 

步骤1:创建一个Android应用。

 

步骤2:写Java中需要用到的native函数。  

public class JNI {public native int getCInt();public native String getCString();
}  

 

步骤3:保存并自动编译成.class文件。

 

步骤4:打开cmd,将工作路径切换/bin/classes/。在编译时要加上包名,例子:javah -jni [包名].[类名]。

 

步骤5:在工程目录下新建jni文件夹,把上面产生的.h文件拷贝过去,并以jni文件夹新建一个C++工程。

注意:工程有时候找不到头文件时,需要手动添加。

C:\cygwin\lib\gcc\i686-pc-cygwin\4.5.3\include\c++
C:\cygwin\lib\gcc\i686-pc-cygwin\4.5.3\include\c++\i686-pc-cygwin
C:\cygwin\lib\gcc\i686-pc-cygwin\4.5.3\include\c++\backward
C:\cygwin\lib\gcc\i686-pc-cygwin\4.5.3\include
C:\cygwin\lib\gcc\i686-pc-cygwin\4.5.3\include-fixed
C:\cygwin\usr\include
C:\cygwin\usr\include\w32api

JNI的位置:${NDKROOT}/platforms/android-9/arch-arm/usr/include

 

步骤6:编写c/c++文件:

#include
#include
#include "com_example_com_ndk_JNI.h"int add2()
{
int x,y;x=1000;y=8989;x+=y;return x;}/** Class: com_example_com_ndk_JNI* Method: getCInt* Signature: ()I*/
JNIEXPORT jint JNICALL Java_com_example_com_ndk_JNI_getCInt(JNIEnv
*env, jobject thiz)
{
return add2();
}
/** Class: com_example_com_ndk_JNI* Method: getCString* Signature: ()Ljava/lang/String;*/
JNIEXPORT jstring JNICALL Java_com_example_com_ndk_JNI_getCString(JNIEnv
*env, jobject thiz)
{(
*env)->NewStringUTF(env,"Hello NDK---->> ");
}

注意:编辑之后,函数为(JNIEnv *, jobject)只有参数类型没有参数变量,请改为(JNIEnv *env, jobject thiz)

 

步骤7:编译之前要写2个.mk格式的文件。

第一个.mk文件是Android.mk文件,这个文件放在jni目录下,内容为:

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

LOCAL_MODULE := HelloNDK
LOCAL_SRC_FILES := com_example_com_ndk_JNI.c

include $(BUILD_SHARED_LIBRARY)

第一句话是写明c/c++文件的路径
第二句话是清空
第三句话是项目的名称
第四句话是源文件的名称
第五句话是指编辑成共享的库(.so)

另一个是Application.mk,这个文件也放在jni目录下,内容为:

APP_PROJECT_PATH := $(call my-dir)/..
APP_MODULE := HelloNDK

第一句是你的项目的路径。

 

步骤8:打开Cygwin,进入到项目根目录,运行$NDK\ndk-build生成so库。

  生成的so库会自动保存在libs文件夹里。

 

步骤9:编写Android程序,加载so库。方式为定义一个static块,载入库文件System.loadLibrary("库名")。

import android.os.Bundle;
import android.app.Activity;
import android.widget.TextView;public class MainActivity extends Activity {static{System.loadLibrary("HelloNDK");}@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);JNI jni= new JNI();TextView textView=(TextView)findViewById(R.id.tvHello);textView.setText(jni.getCString()+Integer.toString(jni.getCInt()));}
}

 

步骤10:运行Android程序。  

 


PS1:可以在Eclipse里面直接编译成so库而不用打开Cygwin

步骤1:

步骤2:进入工程属性页,build command设置为ndk下ndk-build的完整路径。

 

PS2:

如果你不需要使用NDK开发,只是需要使用第三方用NDK开发的库,那么你只需要这样做:把第三方提供的libxxx.so放到你的/libs/armeabi/下, 然后在程序随便什么地方中加入
static {
    System.loadLibray("xxx");
}
就可以使用该库了。

转:https://www.cnblogs.com/TseChiHoi/archive/2012/10/22/2730843.html



推荐阅读
  • 本文概述了JNI的原理以及常用方法。JNI提供了一种Java字节码调用C/C++的解决方案,但引用类型不能直接在Native层使用,需要进行类型转化。多维数组(包括二维数组)都是引用类型,需要使用jobjectArray类型来存取其值。此外,由于Java支持函数重载,根据函数名无法找到对应的JNI函数,因此介绍了JNI函数签名信息的解决方案。 ... [详细]
  • Android源码深入理解JNI技术的概述和应用
    本文介绍了Android源码中的JNI技术,包括概述和应用。JNI是Java Native Interface的缩写,是一种技术,可以实现Java程序调用Native语言写的函数,以及Native程序调用Java层的函数。在Android平台上,JNI充当了连接Java世界和Native世界的桥梁。本文通过分析Android源码中的相关文件和位置,深入探讨了JNI技术在Android开发中的重要性和应用场景。 ... [详细]
  • 本文介绍了lua语言中闭包的特性及其在模式匹配、日期处理、编译和模块化等方面的应用。lua中的闭包是严格遵循词法定界的第一类值,函数可以作为变量自由传递,也可以作为参数传递给其他函数。这些特性使得lua语言具有极大的灵活性,为程序开发带来了便利。 ... [详细]
  • HDU 2372 El Dorado(DP)的最长上升子序列长度求解方法
    本文介绍了解决HDU 2372 El Dorado问题的一种动态规划方法,通过循环k的方式求解最长上升子序列的长度。具体实现过程包括初始化dp数组、读取数列、计算最长上升子序列长度等步骤。 ... [详细]
  • Android中高级面试必知必会,积累总结
    本文介绍了Android中高级面试的必知必会内容,并总结了相关经验。文章指出,如今的Android市场对开发人员的要求更高,需要更专业的人才。同时,文章还给出了针对Android岗位的职责和要求,并提供了简历突出的建议。 ... [详细]
  • baresip android编译、运行教程1语音通话
    本文介绍了如何在安卓平台上编译和运行baresip android,包括下载相关的sdk和ndk,修改ndk路径和输出目录,以及创建一个c++的安卓工程并将目录考到cpp下。详细步骤可参考给出的链接和文档。 ... [详细]
  • Android Studio Bumblebee | 2021.1.1(大黄蜂版本使用介绍)
    本文介绍了Android Studio Bumblebee | 2021.1.1(大黄蜂版本)的使用方法和相关知识,包括Gradle的介绍、设备管理器的配置、无线调试、新版本问题等内容。同时还提供了更新版本的下载地址和启动页面截图。 ... [详细]
  • C++字符字符串处理及字符集编码方案
    本文介绍了C++中字符字符串处理的问题,并详细解释了字符集编码方案,包括UNICODE、Windows apps采用的UTF-16编码、ASCII、SBCS和DBCS编码方案。同时说明了ANSI C标准和Windows中的字符/字符串数据类型实现。文章还提到了在编译时需要定义UNICODE宏以支持unicode编码,否则将使用windows code page编译。最后,给出了相关的头文件和数据类型定义。 ... [详细]
  • CentOS 7部署KVM虚拟化环境之一架构介绍
    本文介绍了CentOS 7部署KVM虚拟化环境的架构,详细解释了虚拟化技术的概念和原理,包括全虚拟化和半虚拟化。同时介绍了虚拟机的概念和虚拟化软件的作用。 ... [详细]
  • 本文介绍了Sencha Touch的学习使用心得,主要包括搭建项目框架的过程。作者强调了使用MVC模式的重要性,并提供了一个干净的引用示例。文章还介绍了Index.html页面的作用,以及如何通过链接样式表来改变全局风格。 ... [详细]
  • DSP中cmd文件的命令文件组成及其作用
    本文介绍了DSP中cmd文件的命令文件的组成和作用,包括链接器配置文件的存放链接器配置信息、命令文件的组成、MEMORY和SECTIONS两个伪指令的使用、CMD分配ROM和RAM空间的目的以及MEMORY指定芯片的ROM和RAM大小和划分区间的方法。同时强调了根据不同芯片进行修改的必要性,以适应不同芯片的存储用户程序的需求。 ... [详细]
  • 本文详细介绍了Android中的坐标系以及与View相关的方法。首先介绍了Android坐标系和视图坐标系的概念,并通过图示进行了解释。接着提到了View的大小可以超过手机屏幕,并且只有在手机屏幕内才能看到。最后,作者表示将在后续文章中继续探讨与View相关的内容。 ... [详细]
  • 动态规划算法的基本步骤及最长递增子序列问题详解
    本文详细介绍了动态规划算法的基本步骤,包括划分阶段、选择状态、决策和状态转移方程,并以最长递增子序列问题为例进行了详细解析。动态规划算法的有效性依赖于问题本身所具有的最优子结构性质和子问题重叠性质。通过将子问题的解保存在一个表中,在以后尽可能多地利用这些子问题的解,从而提高算法的效率。 ... [详细]
  • 本文介绍了UVALive6575题目Odd and Even Zeroes的解法,使用了数位dp和找规律的方法。阶乘的定义和性质被介绍,并给出了一些例子。其中,部分阶乘的尾零个数为奇数,部分为偶数。 ... [详细]
  • Go Cobra命令行工具入门教程
    本文介绍了Go语言实现的命令行工具Cobra的基本概念、安装方法和入门实践。Cobra被广泛应用于各种项目中,如Kubernetes、Hugo和Github CLI等。通过使用Cobra,我们可以快速创建命令行工具,适用于写测试脚本和各种服务的Admin CLI。文章还通过一个简单的demo演示了Cobra的使用方法。 ... [详细]
author-avatar
别说没用的妇
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有