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' 的类文件。
#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;}编辑完之后,你会发现编译器会提示很多的错误,主要的原因就是有一些头文件没有包含进来。
项目右键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 实例项目成功。
- Android 第三方库使用实例——编写.so库文件
- cocos2dx转到android项目,使用第三方so库文件
- android调用第三方库——第三篇——编写库android程序整合第三方库libhello.so到自己的库libhelloword.so
- android调用第三方库——第三篇——编写库android程序整合第三方库libhello.so到自己的库libhelloword.so
- android调用第三方so库文件
- android调用第三方库——第二篇——编写库android程序直接调用第三方库libhello.so
- [置顶] android调用第三方库——第二篇——编写库android程序直接调用第三方库libhello.so
- android利用jni调用第三方库——第二篇——编写库android程序直接调用第三方库libhello.so
- Android Studio使用自定义的Android.mk文件编译第三方so库
- android利用jni调用第三方库——第三篇——编写库android程序整合第三方库libhello.so到自己的库libhelloword.so
- Cocos2d-X学习——Android移植,使用第三方库.so被删掉问题
- Cocos2d-X学习——Android移植,使用第三方库.so被删掉问题
- android工程添加第三方库.so文件
- android ndk 怎样调用第三方的so库文件
- cocos2d-x使用第三方的so库文件
- android使用第三方*.so库的一些问题
- 解决Android使用第三方库.so自动删除问题
- 解决Android使用第三方库.so自动删除问题
- LeetCode:150. Evaluate Reverse Polish Notation(逆波兰表达式)
- LDA整体流程
- 由浅入深:自己动手开发模板引擎——置换型模板引擎(二)
- WordPress常用模板函数
- apns 总结心得,从小白到大白!后台,退出等情况
- Android 第三方库使用实例——编写.so库文件
- poj 1789 Truck History
- 由浅入深:自己动手开发模板引擎——置换型模板引擎(三)
- RPC相关知识
- css3 flex
- Android 6.0 需要在运行时请求权限
- Spring安全框架 Spring Security
- 【Java学习】Java异常-Try、Throws、Throw关键字理解
- bootstrap-table 筛选数据报400错误