制作Android的內(nèi)置APK,調(diào)用C或者C++去調(diào)用底層接口:

讓客戶滿意是我們工作的目標(biāo),不斷超越客戶的期望值來自于我們對這個行業(yè)的熱愛。我們立志把好的技術(shù)通過有效、簡單的方式提供給客戶,將通過不懈努力成為客戶在信息化領(lǐng)域值得信任、有價值的長期合作伙伴,公司提供的服務(wù)項目有:域名申請、虛擬主機、營銷軟件、網(wǎng)站建設(shè)、饒平網(wǎng)站維護、網(wǎng)站推廣。
環(huán)境配置:
eclipse要配置NDK插件和系統(tǒng)環(huán)境,我用的是WIN7,先去下載NDK,解壓后就是一個目錄,把路徑記住,去XP電腦配置下環(huán)境,就像配置Java環(huán)境一樣,把路徑寫到系統(tǒng)環(huán)境的PATH就好了(這樣就可以編譯JNI了)。然后在配置eclipse的NDK插件,點擊eclipse的WINDOW/PREFERNCES,彈出框了后點擊android/NDK,有個路徑選擇,一樣選擇你下載好解壓的目錄(選擇后提示不是有效的NDK目錄的時候,你在NDK目錄里面新建一個文件,名字寫:ndk-build,沒有后綴)
關(guān)于如何在Android使用JNI調(diào)用C/C++代碼庫,網(wǎng)上已經(jīng)有很多優(yōu)秀的文章了,這里說一個大概過程吧:
首先需要懂C,其次要明白JNI的開發(fā)流程,然后還要知道NDK如何使用
1、在java代碼中聲明了一個native本地方法
Public native String helloFromc();
2、在項目目錄中創(chuàng)建JNI文件夾
3、在JNI文件夾里面創(chuàng)建C文件,按照規(guī)范寫代碼
Jstring
Java_com_cheng_jnitest_MainActivity_helloFromc(JNIEnv* env,jobject obj)
4、用ndk-build指令編譯
編譯前需要配置Android.mk文件
//指定編譯的文件夾,指定當(dāng)前的目錄
LOCAL_PATH := $(call my-dir)
//編譯器在編譯的時候會產(chǎn)生很多臨時變量,中間變量最好在編譯前清空所有的臨時變量
include $(CLEAR_VARS)
//編譯完成后的模塊名
LOCAL_MOUDLE := hello
//編譯的源文件
LOCAL_SRC_FILES:=hello.c
//編譯一個動態(tài)庫
//動態(tài)庫.so 只包含運行的函數(shù),不包含依賴,所以體積小,運行的時候回去系統(tǒng)尋找依賴
//靜態(tài)庫.a 包含所有的函數(shù)和運行的依賴,所以體積大,包含所有的api
include $(BUILD_SHARED_LIBRARY)
5、生成了一個so動態(tài)庫,放到了libs里面
6、項目中引入依賴庫
Static{
System.loadLibrary("hello");
}
-
調(diào)用jni里面的方法,過程如下:
第一步:
使用Java編寫HelloWorld 的Android應(yīng)用程序:
package com.lucyfyr;
import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
public class HelloWorld extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Log.v("dufresne", printJNI("I am HelloWorld Activity"));
}
static
{
//加載庫文件
System.loadLibrary("HelloWorldJni");
}
//聲明原生函數(shù) 參數(shù)為String類型 返回類型為String
private native String printJNI(String inputStr);
}
這一步我們可以使用eclipse來生成一個App;
因為eclipse會自動為我們編譯此Java文件,后面要是用到。
第二步:
生成共享庫的頭文件:
進入到eclipse生成的Android Project中 :/HelloWorld/bin/classes/com/lucyfyr/ 下:
可以看到里面后很多后綴為.class的文件,就是eclipse為我們自動編譯好了的java文件,其中就有:
HelloWorld.class文件。
退回到classes一級目錄:/HelloWorld/bin/classes/
執(zhí)行如下命令:
javah com.lucyfyr.HelloWorld
生成文件:com_lucyfyr_HelloWorld.h
/* DO NOT EDIT THIS FILE - it is machine generated */
#include jni.h
/* Header for class com_lucyfyr_HelloWorld */
#ifndef _Included_com_lucyfyr_HelloWorld
#define _Included_com_lucyfyr_HelloWorld
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: com_lucyfyr_HelloWorld
* Method: printJNI
* Signature: (Ljava/lang/String;)Ljava/lang/String;
*/
JNIEXPORT jstring JNICALL Java_com_lucyfyr_HelloWorld_printJNI
(JNIEnv *, jobject, jstring);
#ifdef __cplusplus
}
#endif
#endif
可以看到自動生成對應(yīng)的函數(shù):Java_com_lucyfyr_HelloWorld_printJNI
Java_ + 包名(com.lucyfyr) + 類名(HelloWorld) + 接口名(printJNI):必須要按此JNI規(guī)范來操作;
java虛擬機就可以在com.simon.HelloWorld類調(diào)用printJNI接口的時候自動找到這個C實現(xiàn)的Native函數(shù)調(diào)用。
當(dāng)然函數(shù)名太長,可以在.c文件中通過函數(shù)名映射表來實現(xiàn)簡化。
第三步:
實現(xiàn)JNI原生函數(shù)源文件:
新建com_lucyfyr_HelloWorld.c文件:
當(dāng)前標(biāo)題:android調(diào)用jni,android調(diào)用jni讀取內(nèi)存
本文鏈接:http://chinadenli.net/article24/dsgchce.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供面包屑導(dǎo)航、建站公司、定制網(wǎng)站、App設(shè)計、虛擬主機、網(wǎng)站改版
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)