JNI(Java Native Interface, Java本地化方法)使得Java能与其它语言(如C、C++)的动态库进行交互。

在Android 项目中,经常看到地图,统计,推送之类的第三方平台都用了 JNI。

Android NDK(Android Native Development Kit)是一系列的开发工具,使用JNI编程,可以提高程序的执行效率,更方便地使用现存的开源库。

至于配置NDK环境,无论是Cygwin还是最新的(无Cygwin),网上的教程太多了,这里不再赘述。

好了,下面开始写一个入门Demo了……

首先新建一个Android project

项目右键点击-Android Tools -Add Native Support

点击Finish。

可以看到在Android项目中生成了一个JNI文件:

然后在MainActivity 中添加以下代码:

public class MainActivity extends ActionBarActivity {

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

initJNI();

}

private void initJNI() {

TextView tv = new TextView(this);

tv.setTextSize(25);

tv.setBackgroundColor(Color.parseColor("#FFA07A"));

tv.setText(myTestNdk());

tv.setGravity(Gravity.CENTER);

setContentView(tv);

}

public native String myTestNdk();

static {

System.loadLibrary("TestBaseJNI");

}

}

System.loadLibrary("TestBaseJNI")表示VM去加载动态库TestBaseJNI.so文件;

public native String myTestNdk(),这里的native表示这个方法由本地代码定义,需要通过jni接口调用本地c/c++代码,在java代码中仅仅是声明。

然后在TestBaseJNI.cpp添加以下代码:

#include

#include

extern "C" {

jstring Java_com_example_testbase_MainActivity_myTestNdk(JNIEnv* env,

jobject thiz) {

return env->NewStringUTF("Hello NDK");

}

}

声明加extern "C",是解决C++函数名问题;

"Java_com_example_testbase_MainActivity_myTestNdk",严格按照这种格式写。开头是Java,后面依次是包名,Activity名,方法名;

jstring表示返回类型,这段函数的功能就是返回字符串"Hello NDK"。

这时候可能会报错。

Type 'jstring' could not be resolved

Method 'NewStringUTF' could not be resolved等等。

遇到这些类错误:

Type 'XXX' could not be resolved

Method  'XXX' ' could not be resolved

常见的解决办法:

右键->Properties,点击C/C++ General展开,点击Path and Symbols, 右侧Includes,点击Add,把NDK文件夹下的jni头文件和相应的C++头文件添加进来

这是我添加的两个路径:

F:\Installer\Programming\android-ndk32-r10b-windows-x86\android-ndk-r10b\toolchains\mipsel-linux-android-4.8\prebuilt\windows\lib\gcc\mipsel-linux-android\4.8\include

F:\Installer\Programming\android-ndk32-r10b-windows-x86\android-ndk-r10b\platforms\android-19\arch-arm\usr\include

运行成功界面:

好了,我们再通过手动建JNI的方式来实现上面的Demo

首先新建一个Android project

根目录建立JNI文件夹,再分别创建Android.mk和hello-jni.c文件

在MainActivity 中添加以下代码:

public class MainActivity extends ActionBarActivity {

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

TextView myTextView = new TextView(this);

myTextView.setText(stringTestNdk());

setContentView(myTextView);

}

public native String stringTestNdk();

static {

System.loadLibrary("hello-jni");

}

}

hello-jni.c中添加:

#include

#include

/* This is a trivial JNI example where we use a native method

* to return a new VM String. See the corresponding Java source

* file located at:

*

* apps/samples/hello-jni/project/src/com/example/hellojni/HelloJni.java

*/

jstring Java_com_example_testndk_MainActivity_stringTestNdk(JNIEnv* env,

jobject thiz) {

return (*env)->NewStringUTF(env, "Hello Test NDK !");

//return env->NewStringUTF("Hello NDK");

}

Android.mk配置中添加:

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

LOCAL_MODULE := hello-jni

LOCAL_SRC_FILES := hello-jni.c

include $(BUILD_SHARED_LIBRARY)

LOCAL_MODULE表示编译的动态库名称

LOCAL_SRC_FILES 表示源代码文件

建立并配置Builder:

右键-属性-Builder-New-Main,Refresh,Build中如下配置(按照实际项目操作,这里只是举例),编译并生成.so文件。

然后可以看到在在控制台输出信息(如果没有,Project-Clean):

[armeabi] Compile thumb  : hello-jni <= hello-jni.c

[armeabi] SharedLibrary  : libhello-jni.so

[armeabi] Install        : libhello-jni.so => libs/armeabi/libhello-jni.so

在libs-armeabi下生成了libhello-jni.so文件

运行成功截图:

代码就这么几行,注意操作步骤就OK了,Demo就不上传了……

android ndk 界面开发教程,Android NDK开发之入门教程相关推荐

  1. android启动界面修改工具,Android 系统界面调节工具使用及功能

    Android 系统界面调节工具(Android System UI Tuner)是个隐藏功能,里面有一些实验性功能,可以辅助平时开发. 1. 打开 系统界面调节工具是个隐藏功能,打开他说简单也简单, ...

  2. android phonegap 开发教程,phonegap(Cordova) 入门教程

    ## phonegap前期准备 整理文本格式版(内容是一样的)整理格式版补充图片内容 1. node.js安装 1. 下载相应的安装跑进行安装即可 2. 安装phonegap 1. npm insta ...

  3. 我的Android前生今世之缘-学习经验-安卓入门教程(六)

    关注我,每天都有优质技术文章推送,工作,学习累了的时候放松一下自己. 本篇文章同步微信公众号 欢迎大家关注我的微信公众号:「醉翁猫咪」 据我所知,网上教学资料一堆一堆的,那么还有很多人说,如何学习? ...

  4. linux 搭建开发stm32 stlink,ROS2与STM32入门教程-搭建开发环境(ubuntu+eclipse+cubemx+stlink+openocd)...

    ROS2与C++入门教程-搭建开发环境(ubuntu+eclipse+cubemx+stlink+opencd) 说明: 介绍如何在ubuntu下搭建开发环境 环境:ubuntu20.04 + ecl ...

  5. android中界面滑动延伸,android中ViewPager详解--视图滑动、界面卡等效果 (三)

    GuideActivity.java引导界面: import java.util.ArrayList; import java.util.List; import android.app.Activi ...

  6. android ui界面组件,说说 Android 的常见 UI 控件

    这些控件都有一些共有属性,让我们来看看吧: 共有属性 说明 android:id 唯一标识符 android:layout_width 宽度 android:layout_height 高度 andr ...

  7. python入门教程非常详细-Python编程入门教程:从入门到高级,非常详细

    本文的资料和内容是我下载的,觉得非常有用,于是转过来大家瞧瞧: 这里给初学Python的朋友提供一些建议和指导吧.大神请无视, 俗话说:授人以鱼不如授人以渔.所以我这里只是阐述学习过程,并不会直接详细 ...

  8. python3菜鸟教程-总算理解python3中文入门教程

    为了提高模块加载的速度,每个模块都会在__pycache__文件夹中放置该模块的预编译模块,命名为module.version.pyc,version是模块的预编译版本编码,一般都包含Python的版 ...

  9. python教程很详细_Python编程入门教程:从入门到高级,非常详细

    本文的资料和内容是我下载的,觉得非常有用,于是转过来大家瞧瞧: 这里给初学Python的朋友提供一些建议和指导吧.大神请无视, 俗话说:授人以鱼不如授人以渔.所以我这里只是阐述学习过程,并不会直接详细 ...

  10. python入门教程 非常详细-Python编程入门教程:从入门到高级,非常详细

    本文的资料和内容是我下载的,觉得非常有用,于是转过来大家瞧瞧: 这里给初学Python的朋友提供一些建议和指导吧.大神请无视, 俗话说:授人以鱼不如授人以渔.所以我这里只是阐述学习过程,并不会直接详细 ...

最新文章

  1. 大写的服!中科大博士写20万字论文:如何给女朋友送礼物
  2. MySQL数据库初识(基础语句)
  3. GCC安装UBUNTU
  4. C语言预定义宏 __func__、__FUNCTION__、__LINE__、__FILE__、__DATE__、__TIME__
  5. sqlserver的技术规格
  6. JS Ajax异步请求发送列表数据后面多了[]
  7. vb外部调用autocad_AutoCAD教程之图块的各种相关操作和概念
  8. C++(STL):02---tuple容器
  9. pod中mysql配置文件修改_通过configmap更新k8s里的mysql配置文件
  10. oracle alert.log查找,oracle alert.log位置
  11. 使用 Spring 3 MVC HttpMessageConverter 功能构建 RESTful web 服务
  12. MariaDB忘记root密码
  13. MySQL学习记录(导入Excel表到数据库,并筛选条件输出)
  14. 华为服务器centos安装系统,华为裸金属服务器泰山200安装Centos7图文解析
  15. UVA 1600 Patrol Robot 巡逻机器人(BFS)
  16. debian java pick up_ubuntu15.04安装java的时出现Picked up JAVA_TOOL_OPTIONS: -jav
  17. css3中2D转换效果实现二(6)
  18. 有关多项式处理的各种算法总结
  19. Android N Preview 行为变更
  20. 谁在抢泡泡玛特的生意?

热门文章

  1. Windows基本路由配置(cmd/route)
  2. centos7 安装配置mesos+marathon+zookeeper
  3. cookie设置httponly属性防护XSS***
  4. React Native开发之npm start加速
  5. 测试一下能够图文混排
  6. haproxy中acl的与或非三种規則写法
  7. 5G中网络切片技术是什么?—Vecloud
  8. imp导入时触发器的状态
  9. exp中query的使用方法
  10. 3-4 第三天 Generator生成器