在我们这个java与C语言的调用中,分为两个部分,

第一部分是java语言调用C语言的C库,也就是java调C;

第二部分是C语言调用java语言。

这里我主要讲解一下第一种java语言调用C库

这里要求看这篇文章的同学,必须会java语言和C语言,当然能看到这篇文章的人也肯定是会这两门语言了)

首先我们先讲一下C语言要想编写Android应用的话,那我们就不得不提两个东西,JNI和NDK:

首先安装环境

安装环境我就简单说一下需要安装哪些环境,并且这些环境的安装,网上都有教程,那么我就不一一列出了。我就简单说一下,首先安装Android开发的环境,那么我们这里是用的windows下的ecplise(所有操作都是Windows下的)

1、JDK,jre java的开发环境

2、jdk的环境配置以及检测,例:java -version

3、Android的sdk,这里我们有继承的ecplise,也有自己添加插件的ecplise。就看自己选择了,当我们配置到这里之后,正常的开发普通的java,Android应用程序是没问题了。

4、安装NDK,配置NDK的系统环境变量

5、cygwin工具,以及配置环境,以及检测方式, 可能到这里有同学就不明白,这里是一个模拟linux终端的工具,为了实现后面JNI的编译,所以我们要安装这个工具安装,这里大家可以看一下网上的教程,那么这里我们在安装过程中只安装The GNU of the 'make' utility这一条在前面打X就可以了.当我们配置完系统环境之后,通过命令提示符,输入make -version如果显示GNU Make x.xx.xxx就成功了。

6、安装swig代码自动生成工具, 这里的这个工具是一个不需要大家自己手写JNI代码的工具,非常好,可以将我们写的纯c代码直接生成了JNI代码和JAVA代码。 减少了我们去手写JNI代码这个复杂过程。 安装成功之后配置一下他的系统环境变量就可以并在命令提示符上面输入swig -version 同样如果显示版本号的话,那就说明我们安装成功了。

7、现在来写我们第一个java与C混写的Android应用,这里我们可能都不知道无从下手,所以我们在一个原有的NDK代码上面书写来熟悉这一过程。

8、那么首先我们找一个例子,那就是在NDK目录下的sample有一个hello-jni的例子,我们把他导入到我们的ecplise中,这里我们就导入了一个谷歌给我们写好的一个例子。当我们导入之后是不可以写的,我们还需要进行对ecplise配置

9、首先配置的是ecplise的ndk环境,他的环境位置在window->preferences->Android-NDK下,将我们的ndk目录导入进去

10、在我们这个hello-jni的项目上右键Androidtools->add android native support到这里我们的应用程序就可以调用NDK应用程序了。

我要说的是后面的内容也叫就是调用一些特殊的binoic C库的内容 我们要在项目的JNI中写这么几个文件首先第一个 Unix.i Header.c Header.h my_swig_generate.mk我们要修改一下的是Android.mk文件那么现在我就讲这些代码贴出来,大家自己分析一下问什么要这么写?

Unix.i

%module Unix

%{

#include

%}

extern char* userSpace();

extern int sum(int a,int b);

==========================================

/*

* Header.c

*

* Created on: 2015-8-14

* Author: Administrator

*/

#include

#include

#include

#include

#include

#include

#include

#include

#include

int sum(int a, int b) {

return a + b;

}

char* userSpace() {

struct passwd *pw;

char aaa[32] = "abc";

pw = getpwuid(getuid());

strcpy(aaa, pw->pw_name);

char hostn[32] = { 0 };

gethostname(hostn, sizeof(hostn));

char path[50] = { 0 };

char* hello;

hello = malloc(32);

strcpy(hello, "123456");

return hello;

// strcat("@", strcat(hostn, strcat(":", strcat("$", "\n")))));

}

=================================================

=================================================

Header.h

#ifndef HEADER_H_

#define HEADER_H_

int sum(int a, int b);

#endif /* HEADER_H_ */

===============================================================

# Copyright (C) 2009 The Android Open Source Project

#

# Licensed under the Apache License, Version 2.0 (the "License");

# you may not use this file except in compliance with the License.

# You may obtain a copy of the License at

#

# http://www.apache.org/licenses/LICENSE-2.0

#

# Unless required by applicable law or agreed to in writing, software

# distributed under the License is distributed on an "AS IS" BASIS,

# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

# See the License for the specific language governing permissions and

# limitations under the License.

#

LOCAL_PATH := $(call my-dir)

#========================

my_swig_generate.mk(文件信息)

include $(CLEAR_VARS)

LOCAL_MODULE := hello-jni

LOCAL_SRC_FILES := hello-jni.c Header.c

MY_SWIG_PACKAGE := com.apress.swig

MY_SWIG_INTERFACES := Unix.i

MY_SWIG_TYPE := c

include $(LOCAL_PATH)/my_swig_generate.mk

include $(BUILD_SHARED_LIBRARY)

==============================================

Android.mk

ifndef MY_SWIG_PACKAGE

$(error MY_SWIG_PACKAGE is not defined.)

endif

MY_SWIG_OUTDIR:= $(NDK_PROJECT_PATH)/SRC/$(SUBST .,/,$(MY_SWIG_PACKAGE))

ifndef MY_SWIG_TYPE

MY_SWIG_TYPE := c

endif

ifeq ($(MY_SWIG_TYPE),cxx)

MY_SWIG_MODE := - c++

else

MY_SWIG_MODE :=

endif

LOCAL_SRC_FILES+= $(foreach MY_SWIG_INTERFACE,\

$(MY_SWIG_INTERFACES),\

$(basename $(MY_SWIG_INTERFACE))_wrap.$(MY_SWIG_TYPE))

LOCAL_CPP_EXTENSION+= .cxx

%_wrap.$(MY_SWIG_TYPE) : %.i

$(call host-mkdir,$(MY_SWIG_OUTDIR))

swig -java \

$(MY_SWIG_MODE) \

-package $(MY_SWIG_PACKAGE) \

-outdir $(MY_SWIG_OUTDIR) \

$<

先简单说一下,如果我们只是单单使用的swig来完成这个代码的jNI使用,只能使用库函数中的代码,除了库中的代码之外其他的代码都不能使用这里说的其他代码也就是我说的自定义代码,header.c里面的代码 我们的i文件只能时一个接口,不能再里面直接写代码语句所以我们通过.so库的形式进行了链接然后实现了我们的功能。

c java 开发android_java代码与纯C代码混编完成android应用的开发相关推荐

  1. android11开发版小米,MIUI:小米10系列因适配Android 11,开发版暂停更新!

    原标题:MIUI:小米10系列因适配Android 11,开发版暂停更新! 7月份的第一个星期五,MIUI迎来了第459周更新,开发版号为MIUI12 20.7.2.本次有多款机型无法按时发布公测,例 ...

  2. 可重复使用Tab切换代码和纯js代码

    <!DOCTYPE html> <html> <head><meta http-equiv="Content-Type" content= ...

  3. 【Android】蓝牙开发—— 经典蓝牙配对介绍(Java代码实现演示)附Demo源码

    目录 前言 一.连接&配对方法介绍 二.演示:第一次连接蓝牙设备  &  直接与蓝牙设备建立配对 三.总结 四.补充 五.Demo案例源码地址: 前言 前面两篇文章[Android]蓝 ...

  4. Android组件化开发实践(九):自定义Gradle插件

    本文紧接着前一章Android组件化开发实践(八):组件生命周期如何实现自动注册管理,主要讲解怎么通过自定义插件来实现组件生命周期的自动注册管理. 1. 采用groovy创建插件 新建一个Java L ...

  5. 【Android】蓝牙开发——BLE(低功耗蓝牙)(附完整Demo)

    目录 目录 前言 一.相关概念介绍 二.实战开发 三.项目演示 四.Demo案例源码地址 五.更新记录 1.2020/12/29 :修改 setupService()中错误 2.2021/05/14 ...

  6. Android 音视频开发(二):使用 AudioRecord 采集音频PCM并保存到文件(学习笔记)

    关于 AudioRecord Android SDK 提供了两套音频采集的API,分别是:MediaRecorder 和 AudioRecord,前者是一个更加上层一点的API,它可以直接把手机麦克风 ...

  7. 爱奇艺Android客户端软件开发实战(全套)

    Android客户端软件开发_10.下载模块的流程分析以及详细流程图等.avi 141.2M Android客户端软件开发_11.多线程断点续传分析和流程图.avi 91.3M Android客户端软 ...

  8. Android 音视频开发学习思路

    Android 音视频开发这块目前的确没有比较系统的教程或者书籍,网上的博客文章也都是比较零散的.只能通过一点点的学习和积累把这块的知识串联积累起来. 初级入门篇: Android 音视频开发(一) ...

  9. 2021了,为什么说音视频技术是技术风口?Android音视频开发这么吃香

    此外,H265交互式投屏技术在互动上更是丝滑到了极致 那么,我们该如何学习交互式投屏技术呢? 而如今音视频的知识纷繁复杂,自己学习非常困难,既需要非常扎实的基础知识,又需要有很多的工程经验: 而音视频 ...

最新文章

  1. 详解|工业机器人内部机构详解
  2. Xamarin Android提示找不到资源属性定义
  3. Android Volley彻底解决(三),定制自己Request
  4. Ubuntu 安装任意版本Django
  5. css渲染(一) 字体
  6. 拓展欧几里得理论基础(含一定证明)
  7. lambda里面赋值局部变量必须是final原因
  8. TabTopUnderLineLayout【自定义顶部选项卡(带下划线)】
  9. 面试题解(4):求排列、组合
  10. Intel 64/x86_64/IA-32/x86处理器 - 指令格式(9) - 64位指令格式(通用格式)
  11. C/C++ 进阶 —— 指向指针的指针
  12. 执行下面程序段后,y的结果是____。int x,y;x=y=2;x=x-2(y=y+1);printf(“%d“,y);A。3 B.2 C.1 D。0
  13. 日常琐事的记录,每周六晚做一次总结整理
  14. C# 从入门到精通 学习笔记1 第2章 使用变量、操作符和表达式
  15. 树言树语:QQ影音和暴风影音用户体现
  16. Bayesian framework 贝叶斯框架 (R)
  17. linux中文输入配置sougou输入法
  18. 深入解析锂电池保护电路工作原理
  19. 无线路由器服务器连接线,无线路由器连接有线路由器怎么设置?
  20. 云朵怎么画好看?超简单的天空上色教程

热门文章

  1. 解决Silverlight在ChildWindow中进行DragDrop操作问题
  2. phalcon: 解决php7/phalcon3.2以上版本,不支持oracle数据库的方法
  3. elasticsearch解决控制台中文乱码问题
  4. 如何查看功能的源代码?
  5. jQuery复选框选中状态更改事件
  6. psql:FATAL:数据库“user”不存在
  7. 使用GitHub存储库中的更改更新本地存储库
  8. Web前端工程师工作前 VS 工作后
  9. BZOJ 1370: [Baltic2003]Gang团伙 [并查集 拆点 | 种类并查集WA]
  10. Hibernate 和快照