(1)新建android工程

(2)添加NDK路径

(3)添加本地支持

给本地库起名

此时工程目录下会自动生成jni文件夹

此时Makefile也自动生成

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

LOCAL_MODULE    := hello
LOCAL_SRC_FILES := hello.cpp include $(BUILD_SHARED_LIBRARY)

(4)编写准备生成本地库的 cpp文件

#include <jni.h>
#include <string.h> extern "C" {
JNIEXPORT jstring JNICALL Java_com_snail_helloworld_MainActivity_myhello(JNIEnv * env, jobject obj);
}; JNIEXPORT jstring JNICALL Java_com_snail_helloworld_MainActivity_myhello(JNIEnv * env, jobject obj)
{
return env->NewStringUTF("Hello From CPP");
}

注意

Java_com_snail_hello_MainActivity_myhello

Java                             为固定的

com_snail_helloworld  为包名

MainActivity                 为Activity名称

myhello                        为上层调用的函数名

这几个命名一定要对应,否则上层调用会出现错误:

“java.lang.UnsatisfiedLinkError: Native method not found”

(5)编译本地cpp生成库文件

在cmd下进入工程目录:

执行 ndk-build 进行编译(前提是NDK路径已经加入到Path环境变量中)

(6)在Activity中调用本地函数库

package com.snail.helloworld;

import android.app.Activity;
import android.os.Bundle;
import android.view.Menu;
import android.widget.TextView; public class MainActivity extends Activity { @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
TextView myTextField = (TextView)findViewById(R.id.myText);
myTextField.setText(myhello());
} public native String myhello(); static {
System.loadLibrary("hello");
} @Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
} }

运行:

调用成功!

附录:

ndk-build的选项

所有给ndk-build的选项都会直接传给GNU Make,由make运行NDK的编译脚本。几个常见调用方式如下:

ndk-build 编译

ndk-build clean 清掉二进制文件

ndk-build NDK_DEBUG=1 编译为可调试版的二进制文件

ndk-build NDK_DEBUG=0 编译为release版

ndk-build V=1 执行ndk-build且打印出它所执行的详细编译命令。

ndk-build -B 强制重新编译

ndk-build -B V=1 -B 和 V=1 的组合

ndk-build NDK_LOG=1 打印出内部的NDK日志信息(用于调试NDK自己)

ndk-build NDK_APP_APPLICATION_MK=<文件路径> 用这里指定的路径寻找Application.mk文件

ndk-build -C <project路径> 先cd进入<project路径>,然后执行ndk-build。

(2)官方参考
http://permadi.com/blog/2011/09/creating-your-first-android-jnindk-project-in-eclipse-with-sequoyah/

(3)其他参考

http://cherishlc.iteye.com/blog/1756762

android-----JNI学习 helloworld的更多相关文章

  1. Android JNI学习(五)——Demo演示

    本系列文章如下: Android JNI(一)——NDK与JNI基础 Android JNI学习(二)——实战JNI之“hello world” Android JNI学习(三)——Java与Nati ...

  2. Android JNI学习(四)——JNI的常用方法的中文API

    本系列文章如下: Android JNI(一)——NDK与JNI基础 Android JNI学习(二)——实战JNI之“hello world” Android JNI学习(三)——Java与Nati ...

  3. Android JNI学习(三)——Java与Native相互调用

    本系列文章如下: Android JNI(一)——NDK与JNI基础 Android JNI学习(二)——实战JNI之“hello world” Android JNI学习(三)——Java与Nati ...

  4. Android JNI学习(二)——实战JNI之“hello world”

    本系列文章如下: Android JNI(一)——NDK与JNI基础 Android JNI学习(二)——实战JNI之“hello world” Android JNI学习(三)——Java与Nati ...

  5. Android JNI 学习(一):JNI 简介

    JNI 即 Java Native Interface 是 native 编程接口,它允许在Java虚拟机(VM)内运行Java代码与其他编程语言(主要是C和C++)编写的应用程序和库进行交互操作. ...

  6. Android Studio 学习 - HelloWorld

    今天是学习Android Studio的第2天,加油! 1. 首先要记录下使用Android Studio的一个代码自动完成的功能.平常基本上用Delphi,乍一换工具,各种不习惯,或者说不熟悉.按照 ...

  7. android JNI学习之一

    执行System.loadLibrary()函数时,VM会反向调用*.so里的JNI_OnLoad()函数.用途有二:1. VM询问此*.so使用的JNI版本编号.2. VM要求*.so做一些初期设定 ...

  8. Android JNI学习之javah命令的正确使用(找了好半天才找到的,汉,网上好多说法都没用)

    按照网上抄来的javah用法一般出错,今天查了一下午在一篇文章(http://www.ibm.com/developerworks/cn/java/j-jtctips/part6/index2.htm ...

  9. Android JNI 学习(十一):Invocation Api

    1. 简介 Invocation API允许软件提供商在原生程序中内嵌Java虚拟机.因此可以不需要链接任何Java虚拟机代码来提供Java-enabled的应用程序. 以下代码演示如何使用: #in ...

  10. Android JNI 学习(十):String Operations Api & Other Apis

    一.String Operations(字符串操作) 1. NewString jstring NewString(JNIEnv *env, const jchar *unicodeChars, js ...

随机推荐

  1. c#写个基础的Socket通讯

    晚上想写点东西,想想把我刚来公司学的Sockt通讯写上来吧.要写的简单易懂点,新人们可以借鉴下哦,用控制台写. 先得说说Socket,与TCP/UDP啥关系,一直讲什么Socket通讯,TCP通讯,都 ...

  2. PHPCMS栏目调用2

    {php $j=1;}                {loop subcat(50) $v}                {php if($v['type']!=0) continue;}     ...

  3. Python核心编程2第四章课后练习

    4-1 Python 对象.与所有 Python 对象有关的三个属性是什么?请简单的描述一下.      身份:对象的唯一标识      类型 :对象的类型决定了该对象可以保存什么类型的值       ...

  4. Android模拟器常用命令收录

    一.Linux命令 1.挂载/systme分区为读写状态 mount -o remount,rw -t yaffs2 /dev/block/mtdblock3 /system 2.切换为Root用户 ...

  5. onethink

    http://document.onethink.cn/manual_1_0.html#onethink_usehelp_index

  6. HNOI2015滚粗记

    HNOI2015滚粗记 经过两天的苦战,艰难的HNOI终于结束了.感觉这次HNOI自己还是收获了许多. \(Day1\)打的很是艰难,题目一下就有种晕头转向的感觉.开场\(20min\)自己还在读题时 ...

  7. Servo: The Embeddable Browser Engine

    Embedding, in the context of this article, is the process of hosting a web rendering engine inside a ...

  8. PHP 如何安全的使用 MySQL ?

    大多数 PHP 程序员对 MySQL 肯定不陌生,至于各种 MySQL 函数的用法在开发手册和 w3school 这类网站上也有很多介绍.但是,你所用的写法真的安全吗?面对越来越猖獗的黑客攻击,SQL ...

  9. cron表达式详解(Spring定时任务配置时间间隔)

    Cron表达式是一个字符串,字符串以5或6个空格隔开,分为6或7个域,每一个域代表一个含义,Cron有如下两种语法格式: Seconds Minutes Hours DayofMonth Month ...

  10. 李洪强iOS开发之-环信02_iOS SDK 介绍及导入

    李洪强iOS开发之-环信02_iOS SDK 介绍及导入 iOS SDK 介绍及导入 iOS SDK 介绍 环信 SDK 为用户开发 IM 相关的应用提供的一套完善的开发框架.包括以下几个部分: SD ...