在我们这个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库的形式进行了链接然后实现了我们的功能。
Copyright © 2004-2024 华清远见教育科技集团 版权所有
京ICP备16055225号-5,京公海网安备11010802025203号