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

