1. 程式人生 > >Android NDK 開發教程三 Hello JNI 示例

Android NDK 開發教程三 Hello JNI 示例

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow

也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!

               

Android NDK 開發包帶有不少例子,一個簡單的例子Hello-Jni ,介紹瞭如何使用Java呼叫C函式。

1. 可以使用Eclipse的import 將該專案新增到工作目錄中.

該專案目錄結構如下:

├── AndroidManifest.xml
├── default.properties
├── hellojni.txt
├── jni
│ ├── Android.mk
│ └── hello-jni.c

├── res
│ └── values
│ └── strings.xml
├── src
│ └── com
│ └── example
│ └── hellojni
│ └── HelloJni.java
└── tests
├── AndroidManifest.xml
├── default.properties
└── src
└── com
└── example
└── HelloJni
└── HelloJniTest.java

上面列出使用NDK開發專案的基本的目錄結構,C程式碼一般放在jni目錄下。

2. 編譯Native Code

i) 在命令列(Windows 環境下使用Cygwin的命令列) ,將當前目錄改動到 <ndk-root>/samples/hello-jni

ii) 生成build.xml

android update project -p . -s (注:Windows下可能需要 使用android.bat )

iii) 編譯C程式碼

cd <ndk-root>/samples/hello-jni

<ndk_root>/ndk-build

3. 下面就可以使用Eclipse 編譯執行 Hello Jni.

編寫NDK的一般步驟,

1. 參考Hello-Jni ,修改jni/Android.mk 檔案,將所要編譯的檔案改成自己的檔案。

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

LOCAL_MODULE := hello-jni
LOCAL_SRC_FILES := hello-jni.c

include $(BUILD_SHARED_LIBRARY)

2. 定義Native函式,如HelloJni 中

public native String stringFromJNI();

3. 在Eclipse中編譯該專案,注意此時,你無需定義對於的Native檔案中C函式,因為手工定義對於的C函式很容易出錯,可以藉助javah 工具來完成(包括在JDK中)。

4. 使用Javah 生成對應C函式定義

在命令列下 執行 javah com.example.hellojni.HelloJni

其中com.example.hellojni 為包名,注意執行Javah 的當前目錄 為 <ndk>/examples/hello-jni/bin/classes (你也可以使用javah 的選項來指定classpath).

正確執行好,Javah產生 com_example_hellojni_HelloJni.h

定義如下:

/* DO NOT EDIT THIS FILE - it is machine generated */#include <jni.h>/* Header for class com_example_hellojni_HelloJni */ #ifndef _Included_com_example_hellojni_HelloJni#define _Included_com_example_hellojni_HelloJni#ifdef __cplusplusextern "C" {#endif/* * Class:     com_example_hellojni_HelloJni * Method:    stringFromJNI * Signature: ()Ljava/lang/String; */JNIEXPORT jstring JNICALL Java_com_example_hellojni_HelloJni_stringFromJNI (JNIEnv *, jobject)/* * Class:     com_example_hellojni_HelloJni * Method:    unimplementedStringFromJNI * Signature: ()Ljava/lang/String; */JNIEXPORT jstring JNICALL Java_com_example_hellojni_HelloJni_unimplementedStringFromJNI (JNIEnv *, jobject)#ifdef __cplusplus}#endif#endif

從中可以找到native 方法對應的C函式定義,Java_com_example_hellojni_HelloJni_stringFromJNI

5. 定義對應的C函式,如Hello-jni 中定義

jstringJava_com_example_hellojni_HelloJni_stringFromJNI( JNIEnv* env, jobject thiz )return (*env)->NewStringUTF(env, "Hello from JNI1 !");}

6. 下面就可以使用ndk-build編譯C程式碼,編譯成功後會在libs 目錄下生成libhello-jni.so

7. 在Java程式碼中調入編譯好的C動態庫

 

static { System.loadLibrary("hello-jni"); }

8. 編譯執行,為了測試你的NDK例子的確成功執行,可以對Java_com_example_hellojni_HelloJni_stringFromJNI ,做點小改動 返回 “Hello world from JNI1 !。注意要Clean Project,否則Eclipse可能不會重編譯。



 


 

           

給我老師的人工智慧教程打call!http://blog.csdn.net/jiangjunshow

這裡寫圖片描述