您的位置:首页 > 移动开发 > Android开发

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

2016-07-29 16:49 671 查看
环境:

    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();

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
new AlertDialog.Builder(this).setMessage(sayHello()).show();
}

@Override
public 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 实例项目成功。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: