編輯:關於Android編程
Android JNI (Java Native Interface)就是為了實現java 與其他語言相互調用的語言。當然在Android就是為了跟C,C++的調用。在Linux ,Mac中Java最後調用的就是.so的文件,在Window中就是.dll文件。
那麼Java到C怎麼對應起來?調用Java的哪個方法就是C中的哪個方法呢?通過在Java類中聲明native的方法就開始了。
新建一個Android工程HelloNDK。新建一個類GetString
public class GetString {
public static native String GetString();
public static native String GetString(int a,int b);
public static native String getWord();
}
具體的步驟如下:
1、在Java中聲明native()方法,然後編譯(javac);
2、用javah產生一個.h文件;
3、編寫包含.h文件的c文件
4、編譯c文件
5、使用編譯成功的so文件。
在我建立Android Project中是怎麼實現的?其實在工程的bin/classes/目錄下(classes是隱藏的)就第一步就編譯好了,所以我們在這目錄下進行第二步,命令為:
javah -jni com.example.hellondk.GetString(包+類)
就會生成com.example.hellondk.GetString.h 頭文件,只要你NDK目錄配置好了,接下來就是右鍵工程在Android Tool中選Add Native Support 看到工程名點finish。
接下來就在工程下看到多了jni這個文件夾。裡面有Android.mk,還有同工程名的.cpp文件。
把剛才生成的.h文件拷貝到jni文件夾下。
編寫c文件呢先要看下.h頭文件裡面寫的是什麼
* Class: com_example_hellondk_GetString * Method: GetString * Signature: ()Ljava/lang/String; */ JNIEXPORT jstring JNICALL Java_com_example_hellondk_GetString_GetString__ (JNIEnv *, jclass); /* * Class: com_example_hellondk_GetString * Method: GetString * Signature: (II)Ljava/lang/String; */ JNIEXPORT jstring JNICALL Java_com_example_hellondk_GetString_GetString__II (JNIEnv *, jclass, jint, jint); /* * Class: com_example_hellondk_GetString * Method: getWord * Signature: ()Ljava/lang/String; */ JNIEXPORT jstring JNICALL Java_com_example_hellondk_GetString_getWord (JNIEnv *, jclass);
接下來是實現在.cpp文件中實現這些方法。復制過去
#include "com_example_hellondk_GetString.h"
/*
* Class: com_example_hellondk_GetString
* Method: GetString
* Signature: ()Ljava/lang/String;
*/
JNIEXPORT jstring JNICALL Java_com_example_hellondk_GetString_GetString__
(JNIEnv * env, jclass){
return env->NewStringUTF("hello ndk");
};
/*
* Class: com_example_hellondk_GetString
* Method: GetString
* Signature: (II)Ljava/lang/String;
*/
JNIEXPORT jstring JNICALL Java_com_example_hellondk_GetString_GetString__II
(JNIEnv * env, jclass, jint a, jint b){
return env->NewStringUTF("result a+b="+(a+b));
};
JNIEXPORT jint JNICALL Java_com_example_hellondk_GetInt_getInt
(JNIEnv * env, jclass, jint a){
return a;
};
那現在怎麼使用呢?其實我們還可以看到在工程的libs目錄下生成了armeabi文件夾下生成了libHelloNDK.so庫文件。這個就是我們要使用的.so庫文件啦
在MainActivity中
static {
System.loadLibrary("HelloNDK");
}
Android編程中selector背景選擇器用法實例分析
本文實例講述了Android編程中selector背景選擇器用法。分享給大家供大家參考,具體如下:在Android開發過程中,經常對某一View的背景在不同的狀態下,設置
Android顯示時間和日期的控件的使用總結
相關類的認識Picker(DatePicker、TimerPicker、NumberPicker)其中DatePicker和TimerPicker都有窗口的形式顯示日期和
Android OpenGLES2.0(三)——等腰直角三角形和彩色的三角形
上一篇博客中我們已經繪制出了一個直角三角形,雖然我們相對於坐標,我們設置的直角三角形的兩腰是相等的,但是實際上展示出來的卻並不是這樣,雖然通過計算,我們可以把三角形的兩腰
android關鍵組件service服務(一)
一、 Service簡介 Service是android 系統中的四大組件之一(Activity、Service、BroadcastReceiver、ContentPr