Android jni实例(android源码树编译so库)

    在Android 模拟器中可以对Android手机操作系统进行适当的修改,增加各种功能,以满足用户的需求。那么今天我们会为大家带来Android Jni的相关使用方法,以方便大家对这一系统的解读。Android的应用程序(Dalvik VM)中使用JNI(Java Native Interface)调用C/C++开发的共享库。

    开发环境

    1. (ADT Bundle)   
    2. Windows7  
    3. JDK 1.6.0.12   
    4. Ubuntu Linux 12.04  

    Android Jni使用方法步骤(1) Eclipse中新建Android工程

    1. 工程名 JNItest   
    2. Package名com.ura.test   
    3. Activity名 JNItest   
    4. 应用程序名 JNItest  

    Android Jni使用方法步骤(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>   

    Android Jni使用方法步骤(3)编辑java文件

       
       
       
       
    1. package com.ura.test;   
    2. import Android.app.Activity;   
    3. import Android.os.Bundle;   
    4. import Android.widget.TextView;   
    5. public class JNItest extends Activity { /** Called when the activity is first created. */    static {    System.loadLibrary("JNItest");    } public native String GetTest();  @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_jnitest); String str =GetTest();    TextView  tv = new TextView(this);         tv.setText(str);         setContentView(tv); } }

    Android Jni使用方法步骤(4)生成head文件 

    编译上面工程声称class文件,然后用javah工具生成c/c++头文件。

       
       
       
       
    1. javah -classpath "c:\program files\Android\android-sdk\platforms\android-16\android.jar";. 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. #ifndef _Included_com_ura_test_JNITest   
    5. #define _Included_com_ura_test_JNITest   
    6. #ifdef __cplusplus   
    7. extern "C" {   
    8. #endif   
    9. /*   
    10. * Class: com_ura_test_JNITest   
    11. * Method: GetTest   
    12. * Signature: ()Ljava/lang/String;   
    13. */   
    14. JNIEXPORT jstring JNICALL Java_com_ura_test_JNITest_GetTest   
    15. (JNIEnv *, jobject);   
    16. #ifdef __cplusplus   
    17. }   
    18. #endif   
    19. #endif  

    Android Jni使用方法步骤(5)编写c/c++文件如下

       
       
       
       
    1. #include "com_ura_test_JNITest.h"   
    2. #define LOG_TAG "JNITest"   
    3. #undef LOG   
    4. #include < utils/Log.h>   
    5. JNIEXPORT jstring JNICALL Java_com_ura_test_JNITest_GetTest   
    6. (JNIEnv * env, jobject obj)   
    7. {   
    8. return (*env)->NewStringUTF(env, (char *)
      "JNITest Native String");   
    9. LOGD("Hello LIB!\n");   
    10. }   

    Android Jni使用方法步骤(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)  

    Android Jni使用方法步骤(7)编译生成动态库(在android源码树中)

    新建文件夹

       
       
       
       
    1. ~/mydroid/external/libJNITest  

    把上面编写好的头文件,c/c++源文件,make文件拷贝进上面目录中

    * 需要注意的是把PRELINK_MOUDULE设置成false

    在ubuntu中执行

       
       
       
       
    1. cd   
    2. cd mydroid/build/   
    3. envsetup.sh   
    4. cd ~/mydroid   
    5. cd external/libJNITest/   
    6. mm  

    编译成功的后会在下面目录中生成libJNITest.so文件

       
       
       
       
    1. ~mydroid/out/target/product/generic/system/lib/  

    Android Jni使用方法步骤(8)在模拟器中执行程序

    把动态库拷进ADT Bundle的workspace对应工程的 libs\armeabi中。

    重新编译成apk,启动模拟器,即可看到jni的效果啦。

    ——————————————————————————————————————————————

    过程中遇到的问题:

    1,生成头文件的时候,要在合适的目录下

    在我的上一篇文章中有介绍。

    2,在android源码树编译so库的时候,遇到莫名其妙的问题:

    build/core/dynamic_binary.mk:112: warning: overriding commands for target `.so'
    build/core/dynamic_binary.mk:95: warning: ignoring old commands for target `.so'
    build/core/shared_library.mk:54: warning: overriding commands for target `.so'
    build/core/dynamic_binary.mk:112: warning: ignoring old commands for target `.so'
    make: *** No rule to make target `/JNItest.c', needed by `out/target/product/godbox/obj/SHARED_LIBRARIES/libJNItest_intermediates/JNItest.o'.  Stop.

    (这个问题折腾了一天)最后发现应该是编码集的问题,我的 头文件,源码文件以及Android.mk都是在win7下

    写的,编译的时候会有上面的问题。最后,把上面的文件(主要是Android.mk)在Ubuntu下删掉,重新写一遍,编译

    就正常了。

你可能感兴趣的:(Android jni实例(android源码树编译so库))