Android 第三方库使用实例——编写.so库文件

来源:互联网 发布:苹果电脑编程 编辑:程序博客网 时间:2024/05/10 23:17

环境:

    1. win7 64位系统

    2. eclipse版本: adt-bundle-windows-x86-20131030

    2. Android NDK ,Cygwin,CDT, Sequoyyah,JNI 安装正确


    这两天一直在弄Android的Jni调用第三方库,网上有很多教程是基于linux系统,而我使用的是Windows系统,虽然说原理上是相同的,但是对于一个新手还是遇到了不少的问题,记录一下,以供大家参考。环境安装配置可以参考Android NDK 安装与配置

    主要遇到的问题有:

    1.使用javah 生成不了.h文件

    2.编译出错:无法访问android.app.Activity,找不到android.app.Activity的类文件

    3.编译出错:Error: Program "E:/android/licaibiao/android-ndk-r8/ndk-build" is not found in PATH

    出现这些错误的主要原因是我参照linux系统的第三方库使用,所有在windows系统中就会出现上面的这些问题。


    接下来在win7系统中做一个简单的实例。

    1.先创建一个Android项目。名字为Hello,包名为:com.hello.hello,如下图。这个时候还没有出现JNI和obj文件夹,这个是在后面生成的。


    2.生成jni文件夹

    项目Hello右键 ->  Android  Tools   ->  Add Native Suppot   ->  填写需要生成的库的名称,这里直接使用Hello 。点击finish之后生成就生成了jni文件夹,里面已经有了文件Hello.cpp和Android.mk两个文件。


   3.在MainActivity.java文件中添加下面的代码

package com.hello.hello;import android.os.Bundle;import android.app.Activity;import android.app.AlertDialog;import android.view.Menu;public class MainActivity extends Activity {static{System.loadLibrary("Hello");}public static native String sayHello();@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);new AlertDialog.Builder(this).setMessage(sayHello()).show();}@Overridepublic boolean onCreateOptionsMenu(Menu menu) {// Inflate the menu; this adds items to the action bar if it is present.getMenuInflater().inflate(R.menu.main, menu);return true;}}
    4.利用javah生成.h头文件。

    这里有几点需要特别注意,查看网上的很多资料,它们的都是直接在工程目录下的bin文件夹目录下执行javah com.hello.hello.MainActivity 命令,然后我我就很自然的跑到Cygwin Terminal 相同的目录去执行该命令,结果出来一堆的问题,解了很久,后来才发现,在windows 系统中是需要到dos命令终端去执行该命令,同时,在windows系统中,不是在工程目录的bin目录下执行该命令,而是在src目录下执行命令:javah com.hello.hello.MainActivity 。如下图,如果在src目录下会出现:错误: 找不到 'com.hello.hello.MainActivity' 的类文件。

    在src目录下执行javah com.hello.hello.MainActivity 命令后在src目录中会出现头文件com_hello_hello_MainActivity.h,将他拷贝到jni目录下

    5.编写jni文件夹下的hello.cpp文件
#include <string.h>#include <jni.h>#include "com_hello_hello_MainActivity.h"/* * Class:     com_hello_hello_MainActivity * Method:    sayHello * Signature: ()Ljava/lang/String; */JNIEXPORT jstring JNICALL Java_com_hello_hello_MainActivity_sayHello(JNIEnv *env, jclass){return env->NewStringUTF("hello ,My Name is Wen Li");}jint JNI_OnLoad(JavaVM* vm, void* reserved) {JNIEnv* env = NULL;jint result = -1;if (vm->GetEnv((void**) &env, JNI_VERSION_1_4) != JNI_OK) {return result;}return JNI_VERSION_1_4;}
    编辑完之后,你会发现编译器会提示很多的错误,主要的原因就是有一些头文件没有包含进来。

    6.包含系统头文件
    右键项目Hello  -> Properties  ->  C/C++ Genernal  -> Paths and Symbols, 在Include中添加路径选择Add to all languages

在我的这个工程中,我有添加下面两个路径,错误提示就清除了。
E:\android\licaibiao\android-ndk-r8\platforms\android-8\arch-arm\usr\include
E:\android\licaibiao\android-ndk-r8\toolchains\arm-linux-androideabi-4.4.3\prebuilt\windows\lib\gcc\arm-linux-androideabi\4.4.3\include

    7修改项目的编译选项。

    项目右键Hello -> Hello  -> Properties  -> C/C++ Build ->Build command中填写android-ndk的根目录

  

这里需要特别的注意,在linux平台我们使用的是ndk-build 脚本,但是在windows系统中,我们使用的是ndk-build.cmd脚本。如果在windows中使用ndk-build脚本编译会出现下面的错误提示:

E:\android\licaibiao\android-ndk-r8\ndk-build V=1 
Cannot run program "E:\android\licaibiao\android-ndk-r8\ndk-build": Launching failed
Error: Program "E:/android/licaibiao/android-ndk-r8/ndk-build" is not found in PATH


8配置好编译选项之后,编译项目,项目右键 -> build project 看到控制台出现提示信息如下图,编译成功! 生成了库文件libHello.so


下载到手机查看效果:



OK 实例项目成功。


0 0
原创粉丝点击