當(dāng)前位置:首頁(yè) > 嵌入式培訓(xùn) > 嵌入式學(xué)習(xí) > 講師博文 > java代碼與純C代碼混編完成android應(yīng)用的開發(fā)
在我們這個(gè)java與C語(yǔ)言的調(diào)用中,分為兩個(gè)部分,
第一部分是java語(yǔ)言調(diào)用C語(yǔ)言的C庫(kù),也就是java調(diào)C;
第二部分是C語(yǔ)言調(diào)用java語(yǔ)言。
這里我主要講解一下第一種java語(yǔ)言調(diào)用C庫(kù)
這里要求看這篇文章的同學(xué),必須會(huì)java語(yǔ)言和C語(yǔ)言,當(dāng)然能看到這篇文章的人也肯定是會(huì)這兩門語(yǔ)言了)
首先我們先講一下C語(yǔ)言要想編寫Android應(yīng)用的話,那我們就不得不提兩個(gè)東西,JNI和NDK:
首先安裝環(huán)境
安裝環(huán)境我就簡(jiǎn)單說(shuō)一下需要安裝哪些環(huán)境,并且這些環(huán)境的安裝,網(wǎng)上都有教程,那么我就不一一列出了。我就簡(jiǎn)單說(shuō)一下,首先安裝Android開發(fā)的環(huán)境,那么我們這里是用的windows下的ecplise(所有操作都是Windows下的)
1、JDK,jre java的開發(fā)環(huán)境
2、jdk的環(huán)境配置以及檢測(cè),例:java -version
3、Android的sdk,這里我們有繼承的ecplise,也有自己添加插件的ecplise。就看自己選擇了,當(dāng)我們配置到這里之后,正常的開發(fā)普通的java,Android應(yīng)用程序是沒問(wèn)題了。
4、安裝NDK,配置NDK的系統(tǒng)環(huán)境變量
5、cygwin工具,以及配置環(huán)境,以及檢測(cè)方式, 可能到這里有同學(xué)就不明白,這里是一個(gè)模擬linux終端的工具,為了實(shí)現(xiàn)后面JNI的編譯,所以我們要安裝這個(gè)工具安裝,這里大家可以看一下網(wǎng)上的教程,那么這里我們?cè)诎惭b過(guò)程中只安裝The GNU of the 'make' utility這一條在前面打X就可以了.當(dāng)我們配置完系統(tǒng)環(huán)境之后,通過(guò)命令提示符,輸入make -version如果顯示GNU Make x.xx.xxx就成功了。
6、安裝swig代碼自動(dòng)生成工具, 這里的這個(gè)工具是一個(gè)不需要大家自己手寫JNI代碼的工具,非常好,可以將我們寫的純c代碼直接生成了JNI代碼和JAVA代碼。 減少了我們?nèi)ナ謱慗NI代碼這個(gè)復(fù)雜過(guò)程。 安裝成功之后配置一下他的系統(tǒng)環(huán)境變量就可以并在命令提示符上面輸入swig -version 同樣如果顯示版本號(hào)的話,那就說(shuō)明我們安裝成功了。
7、現(xiàn)在來(lái)寫我們第一個(gè)java與C混寫的Android應(yīng)用,這里我們可能都不知道無(wú)從下手,所以我們?cè)谝粋(gè)原有的NDK代碼上面書寫來(lái)熟悉這一過(guò)程。
8、那么首先我們找一個(gè)例子,那就是在NDK目錄下的sample有一個(gè)hello-jni的例子,我們把他導(dǎo)入到我們的ecplise中,這里我們就導(dǎo)入了一個(gè)谷歌給我們寫好的一個(gè)例子。當(dāng)我們導(dǎo)入之后是不可以寫的,我們還需要進(jìn)行對(duì)ecplise配置
9、首先配置的是ecplise的ndk環(huán)境,他的環(huán)境位置在window->preferences->Android-NDK下,將我們的ndk目錄導(dǎo)入進(jìn)去
10、在我們這個(gè)hello-jni的項(xiàng)目上右鍵Androidtools->add android native support到這里我們的應(yīng)用程序就可以調(diào)用NDK應(yīng)用程序了。
我要說(shuō)的是后面的內(nèi)容也叫就是調(diào)用一些特殊的binoic C庫(kù)的內(nèi)容 我們要在項(xiàng)目的JNI中寫這么幾個(gè)文件首先第一個(gè) Unix.i Header.c Header.h my_swig_generate.mk我們要修改一下的是Android.mk文件那么現(xiàn)在我就講這些代碼貼出來(lái),大家自己分析一下問(wèn)什么要這么寫?
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
#
# //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) \
$<
先簡(jiǎn)單說(shuō)一下,如果我們只是單單使用的swig來(lái)完成這個(gè)代碼的jNI使用,只能使用庫(kù)函數(shù)中的代碼,除了庫(kù)中的代碼之外其他的代碼都不能使用這里說(shuō)的其他代碼也就是我說(shuō)的自定義代碼,header.c里面的代碼 我們的i文件只能時(shí)一個(gè)接口,不能再里面直接寫代碼語(yǔ)句所以我們通過(guò).so庫(kù)的形式進(jìn)行了鏈接然后實(shí)現(xiàn)了我們的功能。