深入剖析ndk配置环境VS简易配置jni流程

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

Windows 32-bit 版本下载地址:

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

Windows 64-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\目录:

进入命令:/d D:\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");
	}
	@Override
	protected 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");
	}
	@Override
	protected 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    := JniSimple
LOCAL_SRC_FILES := JniSimple.c

include $(BUILD_SHARED_LIBRARY)

5、生成头文件

在src上点击进入文件目录(src的根目录),然后在shift+右键进入命令行,输入javah com.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

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

时间: 2024-11-11 14:47:23

深入剖析ndk配置环境VS简易配置jni流程的相关文章

从java的开始,java概述,java配置环境变量

一.java开发入门 java 概述   Java划分为三个技术平台:JavaSE(标准版,含Java基础类库),JavaEE(企业版,技术平台),JavaME(小型版,小型产品.嵌入式设备) Java语言的特点 简单 面向对象 安全 Java不支持指针,一切对内存的访问都必须通过对象的实例变量来实现 跨平台 支持多线程 程序中可以有多个任务并发执行 JDK 与 JRE   JDK (Java Development Kit),是Java提供的一套开发环境,,包含Java编译器.JRE(Java

tomcat如何配置环境变量

下载安装tomcat,如何配置环境变量?配置过程中是否和作者一样经常出现错误?请仔细读文及注意事项. 工具/原料 1,JDK:版本为jdk-7-windows-i586.exe  下载地址http://www.oracle.com/technetwork/java/javase/downloads/index.html2,tomcat:版本为apache-tomcat-7.0.33-windows-x86.zip  下载地址http://tomcat.apache.org/3,windows20

Android 2D游戏引擎AndEngine配置环境

Android 2D游戏引擎AndEngine配置环境 1.2  配置环境 在任何编程中,都需要一些软件或者硬件的支持.否则,没有硬件软件是不可能存在的,而想要编写对应语言的的程序,这需要对应语言库和编译器等的支持.所以在开AndEngine的游戏也需要这些东西,而我们需要的环境都有那些呢?本节内容就将解密AndEngine环境的配置本文选自Android 2D游戏引擎AndEngine快速入门教程. 1.2.1  环境要求 编写AndEngine需要一定的编程环境才可以完成编写.而为了调试,需

配置环境,免得自己忘记经常找

首先肯定的是要下载JDK,下载地址:https://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html,   或者自己百度或谷歌搜索下载网址 安装完成JDK后,  就是要配置环境, 1.配置的环境变量,第一步:JAVA_HOME,JAVA_HOME的内容是jdk安装目录.一般默认为安装目录为:C:\Program Files\Java\jdk1.8.0_131,(注意后面不要带":"号

每天玩转3分钟 MyBatis-Plus - 1. 配置环境

MyBatis-Plus(简称 MP)是一个 MyBatis 的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发.提高效率而生. 准备工作:创建spring boot project 一.配置环境 1.1 配置pom.xml文件 1.1.1  引入 mybatis-plus 依赖 <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-generator&l

【转】Android NDK学习(2)Windows下NDK开发环境配置

一.配置好Android开发环境 现在android SDK的版本已经到了4.4了,几乎不用配置,下载下来解压,SDK跟Android开发专用Eclipse都有了.喜欢. 二.下载安装安卓NDK 下载最新版,解压即可. 2013年6月7日: 目前版本已经到了r8e. 三.下载安装cygwin   由于NDK编译代码时必须要用到make和gcc,所以你必须先搭建一个linux环境, cygwin是一个在windows平台上运行的unix模拟环境,它对于学习unix/linux操作环境,或者从uni

Android NDK R9环境配置,开发教程

最近,在学习android ndk开发,配置环境的时候遇到了些问题,总算不负有心人--在这里记录哈过程,与筒子们分享哈--想学NDK的筒子们有福啦-- 教程本人亲测,非copy的-- 如有什么不明白的地方,可以留言 大神也可以进来瞧瞧有什么不对的地方,请指教两招 ----------------------------------------------------------------------------------------------------------------------

Android NDK开发一:配置环境

一.Windows:Windows下的开发环境需要安装以下软件: Java JDK Apache ANT Build System Android SDK Cygwin Android NDK Eclipse IDE 1.安装Java JDK http://www.oracle.com/technetwork/java/javase/downloads/index.html 配置环境变量:新建一个JAVA_HOME键,值设为JDK的安装目录. 打开PATH键,在末尾增加 ;%JAVA_HOME%

在imac上面Android NDK环境变量的配置

1.首先下载工具包(.bin类型的) http://developer.android.com/ndk/downloads/index.html#download 2.将工具包放置在一个文件夹中,进入文件夹,将压缩文件执行解压 chmod a+x android-ndk-r10c-darwin-x86_64.bin ./android-ndk-r10c-darwin-x86_64.bin 3.配置环境变量 vim ~/.bash_profile进入,输入i ,进入编辑模式,在文件中加上 NDK_