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

    开发环境

    1. (ADT Bundle)
    2. Windows7
    3. JDK1.6.0.12
    4. UbuntuLinux 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. < ?xmlversion="1.0"encoding="utf-8"?>
    2. < LinearLayoutxmlns: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. packagecom.ura.test;
    2. importAndroid.app.Activity;
    3. importAndroid.os.Bundle;
    4. importAndroid.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. /*DONOTEDITTHISFILE-itismachinegenerated*/
    2. #include<jni.h>
    3. /*Headerforclasscom_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. JNIEXPORTjstringJNICALLJava_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. #defineLOG_TAG"JNITest"
    3. #undefLOG
    4. #include<utils/Log.h>
    5. JNIEXPORTjstringJNICALLJava_com_ura_test_JNITest_GetTest
    6. (JNIEnv*env,jobjectobj)
    7. {
    8. return(*env)->NewStringUTF(env,(char*)
      "JNITestNativeString");
    9. LOGD("HelloLIB!\n");
    10. }

    Android Jni使用方法步骤(6)编写Android.mk文件

                
    1. LOCAL_PATH:=$(callmy-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. cdmydroid/build/
    3. envsetup.sh
    4. cd~/mydroid
    5. cdexternal/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下删掉,重新写一遍,编译

    就正常了。

更多相关文章

  1. NPM 和webpack 的基础使用
  2. 【阿里云镜像】使用阿里巴巴DNS镜像源——DNS配置教程
  3. 背部如何画好?动漫人物背部画法步骤
  4. Android(安卓)Studio 3.0以上安装apk报错:Installation failed w
  5. Android高手进阶教程(七)之----Android(安卓)中Preferences的使
  6. Android(安卓)XML解析技术
  7. android私有文件资源文件的读取
  8. Android的多媒体框架OpenCore介绍
  9. android drawable文件夹说明

随机推荐

  1. IIC学习----概念篇
  2. AD21下载和安装教程
  3. STM32定时器3配置时钟的坑
  4. 提供坚固耐用的笔记本电脑的合作技术
  5. 加班做的报表还被老板嫌弃?是因为你不会用
  6. 视频剪辑必备技能:给小视频增加滚动字幕
  7. Python操作各种数据库
  8. 激动人心!Ceph新长支持稳定版本Luminous(12
  9. Docker-LinuxKit搭建及使用场景分析
  10. ssh隧道的特别使用--ssh跳板机的实现