1、下载NDK,最新版本android-ndk-r9.

Windows32-bit版本下载地址:

http://dl.google.com/android/ndk/android-ndk-r9-windows-x86.zip

Windows64-bit版本下载地址:

http://dl.google.com/android/ndk/android-ndk-r9-windows-x86_64.zip

2、解压压缩包.

android-ndk-r9\build:放的一些交叉编译工具

android-ndk-r9\platforms\android-9:编译对应不同的处理器工具

查看\android-ndk-r9\platforms\android-9\arch-arm\usr\include下:jni.h文件简单了解jni协议

例如:

1、typedef const struct JNINativeInterface* JNIEnv;

JNIEnv是常量体结构指针const struct JNINativeInterface*的别名

3、配置环境变量.

1、进入D:\android-ndk-r9-windows-x86\android-ndk-r9\目录:

进入命令:/dD:\android-ndk-r9-windows-x86\android-ndk-r9\

执行命令:ndk-build


如果一劳永逸,就需要配置环境变量

D:\android-ndk-r9-windows-x86\android-ndk-r9

打开任意命令行输入命令:ndk-build

————————————先看稍微复杂的配置流程开发————————————

3、创建工程

4、在src的同级目录下创建jni文件夹

在jni下创建Android.mk(android.mk是Android操作系统编译的时候使用的编译规则文件

下面Android.mk文件的格式可以从F:\sdk\adt-bundle-windows-x86-20130917_2\android-ndk-r9\docs\ANDROID-MK.html查看

#调用系统工具链,当前的作用是调用当前目录文件LOCAL_PATH := $(call my-dir)#初始化工具链,并且清除环境变量,并没有把LOCAL_PATH清除include $(CLEAR_VARS)#LOCAL_MODULE对应的是库的名称,前面是省略lib;后面是省略.so,而且不能加上,加上会报错LOCAL_MODULE := <span style="color:#ff0000;">atguigu</span>#LOCAL_SRC_FILES引用源文件 ,如果有多个源文件怎么办,用空格链接LOCAL_SRC_FILES :=<span style="color:#ff0000;"> Hello.c</span>    #配置动态链接库BUILD_SHARED_LIBRARY,生成.so文件,文件小一些#一般用动态链接库#配置静态链接库BUILD_STATIC_LIBRARY,生成.a文件,文件大一些include $(BUILD_SHARED_LIBRARY)

6、配置文件和入口代码

activity_main.xml(只有一个button)

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"    xmlns:tools="http://schemas.android.com/tools"    android:layout_width="match_parent"    android:layout_height="match_parent"    tools:context=".MainActivity" >    <Button        android:onClick="javaCallC"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:text="Java调用C代码" /></RelativeLayout>

MainActivity.java

package com.atguigu.jnihellodemo;import android.app.Activity;import android.os.Bundle;import android.util.Log;import android.view.View;public class MainActivity extends Activity {{//加载库和LOCAL_MODULE := atguigu一致System.loadLibrary("atguigu");}@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);}//点击事件-Java调用C语言public void javaCallC(View view){String result = say_111Hello();Log.e("TAG","result==="+result );}/** * native方法,方法没有参数,也需要在c文件中传参数 * 调用c代码后,从C代码中返回String类型 */public native String say_111Hello();}

6、操作命令行

在项目的根目录下,shift+右键进入命令行,ndk-build 在libs生成armeabi文件夹,并且在其子目录生成libatguigu.so

在src的同级目录下,shift+右键进入命令行,javah com.atguigu.javacallc.MainActivity(mainActivity全路径),生成javah com.atguigu.javacallc.MainActivity.h文件,并将其拖入到jni目录中

7、创建.c文件

com

#include<stdio.h>#include<stdlib.h>#include "<span style="color:#ff0000;">com_atguigu_jnihellodemo_MainActivity.h</span>"/** *路径的写法:Java_全类名_(把.变成_)方法名 * 因为:typedef const struct JNINativeInterface* JNIEnv; java与c沟通的环境变量结构体是一级指针 * JNIEnv* env参数:const struct JNINativeInterface** 是代表二级指针 * jobject jobj:谁调用了这个方法,就是谁;当前是MainActivity.this */jstring Java_com_atguigu_jnihellodemo_MainActivity_say_1111Hello(JNIEnv* env,jobject jobj){/* * 结构体是一级指针(typedef const struct JNINativeInterface* JNIEnv;) * 结构体方法:jstring     (*NewStringUTF)(JNIEnv*, const char*); */char* text = "I am from C";return (*env)->NewStringUTF(env,text);//return (**env).NewStringUTF(env,text);//return (**env).NewStringUTF(env,"I am from C");}

——————————————下边来看下简易流程配置开发环境——————————

1、定位ndk的地址

window--preferences--NDK Location--F:\sdk\adt-bundle-windows-x86-20130917_2\android-ndk-r9(这是我的ndk地址)

2、在项目上点击右键--Android Tools--Add Native Support(我命名的是JniSimple),就会在libs下生成armeabi\libJniSimple.so

3、感觉乱乱的感觉,先贴下工程的配置文件吧

activity_main.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"    xmlns:tools="http://schemas.android.com/tools"    android:layout_width="match_parent"    android:layout_height="match_parent"    android:paddingBottom="@dimen/activity_vertical_margin"    android:paddingLeft="@dimen/activity_horizontal_margin"    android:paddingRight="@dimen/activity_horizontal_margin"    android:paddingTop="@dimen/activity_vertical_margin"    tools:context=".MainActivity" >    <Button        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:onClick="JavaCallC"         android:text="java掉用c"/></RelativeLayout>

MainActivity.java

package com.example.jnisimple;import android.os.Bundle;import android.app.Activity;import android.view.Menu;import android.view.View;import android.widget.Toast;public class MainActivity extends Activity {{System.loadLibrary("JniSimple");}@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);}public void JavaCallC(View view){String result = sayHello();Toast.makeText(this, "result=="+result, 1).show();}public native String sayHello();}

4、src同级目录下创建jni文件夹

在jni文件夹下创建Android.mk

LOCAL_PATH := $(call my-dir)include $(CLEAR_VARS)LOCAL_MODULE    := JniSimpleLOCAL_SRC_FILES := JniSimple.cinclude $(BUILD_SHARED_LIBRARY)

5、生成头文件

在src上点击进入文件目录(src的根目录),然后在shift+右键进入命令行,输入javahcom.example.jnisimple.MainActivity,然后将其拖入到jni目录下

6、创建JniSimple.c

#include "com_example_jnisimple_MainActivity.h"#include<stdio.h>#include<stdlib.h>JNIEXPORT jstring JNICALL Java_com_example_jnisimple_MainActivity_sayHello  (JNIEnv * env, jobject jobj){return (*env)->NewStringUTF(env,"i am from JniSimple");}
说明下.c文件的方法名字,可以直接从com_example_jnisimple_MainActivity.h拷贝

7、关联源码

在项目上右键--properties--c\c++ general--paths and symbols--add--F:\sdk\adt-bundle-windows-x86-20130917_2\android-ndk-r9\platforms\android-9\arch-arm\usr\include

(这是我自己的地址目录,大家主要参考定位到哪级目录即可)

更多相关文章

  1. Android内存使用研究
  2. 编译Android(安卓)2.3.1 源代码心得
  3. ReactNative项目把Android/ios/react剥离出来独立模块
  4. android 调用系统相机拍照并保存照片原图
  5. Android(安卓)获取git 版本号
  6. 安卓APP:利用AndroidStudio开发usb串口通信软件【第2步】
  7. android studio基础教程:3.美化按钮
  8. Android:TabWidget
  9. Android(安卓)新建文件夹、生成文件并向文件写入文本内容

随机推荐

  1. Android应用程序的组成介绍
  2. 移动开发参考书之Android篇
  3. 在Android中使用ORMLite
  4. Android(安卓)pppd_gprs脚本启动过程
  5. SIMPLE IME 开发
  6. 最近reactNative在开发android中遇到的坑
  7. 阿里android面试准备与题目整理
  8. Android onTouchEvent, onClick及onLongC
  9. Android开发中阴影效果的实现
  10. 【Android】Android NDK入门