Android JNI简单实例(android 调用C/C++代码)
生活随笔
收集整理的這篇文章主要介紹了
Android JNI简单实例(android 调用C/C++代码)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
轉載自?xiechengfa
最終編輯?xiechengfa
| Android JNI簡單實例關鍵字: android、jni Android的jni實例android 的應用程序(Dalvik VM)中使用JNI(Java Native Interface)調用C/C++開發的共享庫。 c/c++中調用java程序的方法以后再發。 開發環境 (eclipse + android ADT) WindowsXP SP3 JDK 1.6.0.12 VMWARE+Ubuntu Linux 8.04 (1) Eclipse中新建android工程 工程名 JNItest Package名com.ura.test Activity名 JNItest 應用程序名 JNItest (2) 編輯main.xml ?? 1. <?xml version="1.0" encoding="utf-8"?> ?? 2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" ?? 3.???? android:orientation="vertical" ?? 4.???? android:layout_width="fill_parent" ?? 5.???? android:layout_height="fill_parent" ?? 6.???? > ?? 7. <TextView? ?? 8.???? android:id="@+id/JNITest" ?? 9.???? android:layout_width="fill_parent" ? 10.???? android:layout_height="wrap_content" ? 11.???? android:text="@string/JNITest" ? 12.???? /> ? 13. </LinearLayout> 14. 復制代碼 (3)編輯java文件 ?? 1. package com.ura.test; ?? 2. ?? 3. import android.app.Activity; ?? 4. import android.os.Bundle; ?? 5. import android.widget.TextView; ?? 6. public class JNITest extends Activity { ?? 7.???? /** Called when the activity is first created. */ ?? 8.??? static { ?? 9.???????????? System.loadLibrary("JNITest"); ? 10.??? } ? 11.??? public native String GetTest(); ? 12.????????? @Override ? 13.???? public void onCreate(Bundle savedInstanceState) { ? 14.???????? super.onCreate(savedInstanceState); ? 15.???????? setContentView(R.layout.main); ? 16.???????? String str =GetTest(); ? 17.???????? TextView JNITest = (TextView)findViewById(R.id.JNITest); ? 18.???????? JNITest.setText(str); ? 19.???? } ? 20. } 復制代碼 (4)生成head文件 編譯上面工程聲稱class文件,然后用javah工具生成c/c++頭文件。 ?? 1. javah -classpath bin -d jni com.ura.test.JNItest 復制代碼 生成的頭文件如下 ?? 1. /* DO NOT EDIT THIS FILE - it is machine generated */ ?? 2. #include <jni.h> ?? 3. /* Header for class com_ura_test_JNITest */ ?? 4. ?? 5. #ifndef _Included_com_ura_test_JNITest ?? 6. #define _Included_com_ura_test_JNITest ?? 7. #ifdef __cplusplus ?? 8. extern "C" { ?? 9. #endif ? 10. /* ? 11. * Class:???? com_ura_test_JNITest ? 12. * Method:??? GetTest ? 13. * Signature: ()Ljava/lang/String; ? 14. */ ? 15. JNIEXPORT jstring JNICALL Java_com_ura_test_JNITest_GetTest ? 16.?? (JNIEnv *, jobject); ? 17. ? 18. #ifdef __cplusplus ? 19. } ? 20. #endif ? 21. #endif 復制代碼 (5)編寫c/c++文件如下 ?? 1. #include "com_ura_test_JNITest.h" ?? 2. ?? 3. ?? 4. ?? 5. #define LOG_TAG "JNITest" ?? 6. ?? 7. #undef LOG ?? 8. ?? 9. #include <utils/Log.h> ? 10. ? 11. ? 12. ? 13. ? 14. ? 15. JNIEXPORT jstring JNICALL Java_com_ura_test_JNITest_GetTest ? 16.?? (JNIEnv * env, jobject obj) ? 17. { ? 18.???? return (*env)->NewStringUTF(env, (char *)"JNITest Native String"); ? 19.???? LOGD("Hello LIB!\n"); ? 20. ? 21. } 復制代碼 (6)編寫android.mk文件 ?? 1. LOCAL_PATH:= $(call my-dir) ?? 2. include $(CLEAR_VARS) ?? 3. LOCAL_SRC_FILES:= \ ?? 4.???? com_ura_test_JNITest.c ?? 5. LOCAL_C_INCLUDES := \ ?? 6.???? $(JNI_H_INCLUDE) ?? 7. LOCAL_SHARED_LIBRARIES := libutils ?? 8. LOCAL_PRELINK_MODULE := false ?? 9. LOCAL_MODULE := libJNITest ? 10. include $(BUILD_SHARED_LIBRARY) 復制代碼 (7)編譯生成動態庫 新建文件夾 ~/mydroid/external/libJNITest 把上面編寫好的頭文件,c/c++源文件,make文件拷貝進上面目錄中 * 需要注意的是把PRELINK_MOUDULE設置成false 否則需要重新做成img文件再燒入。 在ubuntu中執行 ?? 1. cd ?? 2. cd mydroid/build/ ?? 3. envsetup.sh ?? 4. cd ~/mydroid ?? 5. cd external/libJNITest/ ?? 6. mm 復制代碼 編譯成功的后會在下面目錄中生成libJNITest.so文件 ~mydroid/out/target/product/generic/system/lib/ (8)在模擬器中執行程序 首先要把動態庫拷進/system/lib中。 啟動模擬器 ?? 1. adb shell ?? 2. adb remount ?? 3. adb push libJNITest.so /system/lib 復制代碼 確認拷貝成功。 ?? 1. cd /system/lib ?? 2. ls 復制代碼 然后不要關閉模擬器(關掉再開動態庫就沒了,因為模擬器rom是只讀) 執行java程序JNITest 會看到屏幕上打印出 JNITest Native String |
總結
以上是生活随笔為你收集整理的Android JNI简单实例(android 调用C/C++代码)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: linux c编程操作数据库(sqlit
- 下一篇: H264解码器源码(Android 1.