編輯:關於Android編程
隨後我們用命令行工具輸入ant -version命令。如果安裝成功就會輸出ant的版本號。
讀者只需要按照筆者的截圖順序去做就可以安裝成功了,cygwin一定要安裝成功,否則會導致ndk運行的失敗,這也是為什麼筆者花這麼多圖的原因。
隨後我們在命令行窗口輸入ndk-build命令。如果有以下輸出說明安裝成功。
public class CppUtils {
static {
System.loadLibrary("cppUtils");
}
/**
* 從CPP獲取字符串
*
* @return
*/
public native String getStringFromCPP();
}
接著我們就要針對CppUtils.class進行分析生成頭文件,在我們對編寫原生語言頭文件的時候,最好借助工具生成,而不是手寫,這樣出錯的概率才會更低,否則很容易發生jni橋無法將java函數與原生方法聯系起來的錯誤。生成頭文件的方法,就是使用命令行工具。比如筆者這裡就是,先進入自己項目要分析的java文件的目錄下,然後生成頭文件。生成頭文件的命令如下:
javah -classpath bin/classes com.example.jnibolg.CppUtils
完整的操作過程看下圖:
然後回到eclipse中,刷新下我們的項目,我們會發現多了一個以h結尾的文件,這個就是機器生成的頭文件。
關於原聲函數的實現以及祥光頭文件,我們需要放在jni文件夾中,因此,我們接下來需要在項目中建立jni文件夾,並將相關文件放進去。
這樣我們的原生文件就生成了。
/* DO NOT EDIT THIS FILE - it is machine generated */ #include其次我們關注這個函數聲明:/* Header for class com_example_jnibolg_CppUtils */ #ifndef _Included_com_example_jnibolg_CppUtils #define _Included_com_example_jnibolg_CppUtils #ifdef __cplusplus extern "C" { #endif /* * Class: com_example_jnibolg_CppUtils * Method: getStringFromCPP * Signature: ()Ljava/lang/String; */ JNIEXPORT jstring JNICALL Java_com_example_jnibolg_CppUtils_getStringFromCPP (JNIEnv *, jobject);
#ifdef __cplusplus}#endif#endif首先我們可以看到jni.h頭文件被包含了,這個頭文件包含了jni機制為了實現從java對象到原生語言的映射的規則。因此,我們一切java調用原生函數,或者原聲函數調用java,都必須通過它來實現。
JNIEXPORT jstring JNICALL Java_com_example_jnibolg_CppUtils_getStringFromCPP (JNIEnv *, jobject);
確定之後,我們看jni文件夾,會生成NDK支持的文件。
其中cppUtils.cpp是我們要進行實現的C++文件。Android.mk是NDK的makefile文件,通過他,可以將原生語言的實現生成為共享庫。我們之前安裝的cygwin目的就是支持NDK的系統構建。我們打開我們NDK的目錄,筆者的如下:
可以發現NDK有很多makefile文件,這些文件都是用於幫助構成共享庫的。
LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE := cppUtils LOCAL_SRC_FILES := cppUtils.cpp include $(BUILD_SHARED_LIBRARY)
#include "com_example_jniblog_CppUtils.h"
JNIEXPORT jstring JNICALL Java_com_example_jniblog_CppUtils_getStringFromCpp
(JNIEnv * env, jobject jthis)
{
return env->NewStringUTF("來自C++");
}
private TextView text;
CppUtils cppUtils = new CppUtils();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
text = (TextView) findViewById(R.id.text);
text.setText("從C++獲取字符串:" + cppUtils.getStringFromCpp());
}
Android Service生命周期詳解
引言應用程序組件有一個生命周期——一開始Android實例化他們響應意圖,直到結束實例被銷毀。在這期間,他們有時候處於激活狀態,有時候處於非激活狀 態;對於活動,對用戶有
vivo x7怎麼截圖 vivo x7截屏教程
vivo x7怎麼截圖?vivo x7手機是剛剛發布出來的新機,可能有用戶還不會截屏,下文介紹vivo x7截屏圖文流程,一起來瞧瞧吧! vivo x7截
Android消息機制Handler解析(源碼+Demo)
Handler是開發人員在面試過程中最常見的問題之一了,這篇文章將較為全面地對Handler進行解讀,包括源碼層,以及使用方法。如果看完文章有疑問,歡迎在評論中一起探討基
Android apk反編譯:Smali語法入門教程
0x01 smali生成使用apktool反編譯apk後,會在反編譯工程目錄下生成一個smali文件夾其中android下存放所調用庫的smali文件,com才是我們自己