打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
音视频聊天开发: 8 转载:Android下NDK进行JNI开发
上文使用NDK编译出了ffmpeg sdk的各个.so,这里就是讲如何调用了。
考虑到NDK用的比较少,先转载一篇文章,这里详细讲解了如果使用NDK进行JNI开发。
详见: http://my.oschina.net/sosofy/blog/78353
先从该文学习JNI,然后,在下一文中再讲如何调用我们自己编译好的ffmpeg库。
全文再复制一下,做为备份:
最近打算重构项目中的部分代码,将部分耗时或者敏感的代码放到native中实现。说来惭愧,本人今年3月份才开始接触android开发,虽然一早就知道android中可以使用c/c++代码,但一直没有尝试。于是趁着这次机会研究一下android中的ndk开发,花了一个下午加一个上午,经历了种种悲剧后终于跑通了第一个demo。在整个过程中参考了无数文章,也走了很多弯路,特此写下本文章,希望帮助刚刚接触JNI的童鞋们更快的上手。
上面说的貌似是废话,现在开始进入正题。我的开发环境是windows+eclipse,因此在开始真正写代码前,还需要在windows上搭建相关环境才能编译.so文件。这里我推荐看下 http://www.cnblogs.com/jdksummer/articles/2166057.html 这篇配置文章写的很详细。
假设你现在已经搭建好了开发环境,那么开始吧!(听着音乐,开始我们的学习吧!!)
1.打开的
在该类中添加如下代码:都是一些很简单的函数^^
1
2
3
4
5
6
7
package com.example.myjni;
public class JNI {
public native void write();
public native String sayHello();
public native int plus(int a, int b);
}
这个就是native code在java中的接口了。添加完成后,build project。第一步的准备工作就此完成,很容易吧。
2.打开cmd并定位到刚刚新建的"MyFirstJNI"工程目录下的bin/classes目录,执行”javah -classpath .  -jni  com.example.myjni.JNI“,没有意外的话,bin/classes目录下应该会产生一个com_example_myjni_JNI.h文件。这个就是native code需要实现的函数了。
3.现在我们把刚刚得到的.h文件拷贝出,为它新建一个工程,我是手工建立的。建立D:\MyfirstJNISO目录,并建立子目录jni(必须叫这个,否则后面会不能编译哦),并将.h文件拷贝到该目录下,并新建一个com_example_myjni_JNI.c文件实现相关函数,代码如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
#include
#include "com_example_myjni_JNI.h"
JNIEXPORT void JNICALL Java_com_example_myjni_JNI_write
(JNIEnv *env, jobject thiz)
{
}
/*
* Class:     com_example_myjni_JNI
* Method:    sayHello
* Signature: ()Ljava/lang/String;
*/
JNIEXPORT jstring JNICALL Java_com_example_myjni_JNI_sayHello
(JNIEnv *env, jobject thiz)
{
return (*env)->NewStringUTF(env, "Hello from JNI !");
}
/*
* Class:     com_example_myjni_JNI
* Method:    plus
* Signature: (II)I
*/
JNIEXPORT jint JNICALL Java_com_example_myjni_JNI_plus
(JNIEnv *env, jobject thiz, jint a, jint b)
{
return a+b;
}
接着还需要同一个目录下添加一个Android.mk文件,编译时候使用,具体内容如下:
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE    := first_jni                                 (最终so文件名是libfirst_jni.so)
LOCAL_SRC_FILES := com_example_myjni_JNI.c       (代码)
include $(BUILD_SHARED_LIBRARY)
是不是很麻烦,不过我们已经离成功越来越近了。
3.现在整理一下,我们到目前为止的工作,新建了一个android工程以及一个C的工程(暂且叫工程吧),现在开始最重要的一步,编译c代码生成.so文件让android工程中的调用。你现在应该已经配置好了cygwin了吧,打开吧,定位到C工程目录,比如D:\myfirstJNISO的话就执行”cd /cygdrive/D/myfirstJNISO“,然后执行”$NDK/ndk-build
“(其中$NDK和你配置的cygwin有关)。
这样编译的工作就完成了,如果你前面没有犯任何错的话。赶紧打开C工程目录吧应该是这样的吧
黄色标记的目录就是我们需要的东西哦,里面是一个”armeabi“文件夹,里面是编译得到的.so文件。
final.将上面的armeabi文件夹整个拷贝到我们一开始建立的MyfirstJNI工程的libs目录下,所有工作都已就绪,你的工程应该是这样的:
(ps:请忽略android-support-v4.jar这个和本次的内容没关系)
现在就来编写java代码调用吧,在MainActivity中添加必须的代码:
1
2
3
static {
System.loadLibrary("first_jni");
}
这个是让系统加载so库,注意编译生成的库的名字是带前缀lib的,代码中请忽略否则会找不到相应的so文件。
调用就很简单了:
1
2
3
4
5
jni = new JNI();
jni.sayHello();
jni.plus(1,2);
最后添加一些简单的button测试一下吧,我做的比较简陋了:
至此,我们的第一个ndk的demo就跑起来了。
补充:上面是一步一步自己创建的jni工程,还没有包括ffmpeg的调用。。
有一个不错的例子,从编译ffmpeg到创建jni调用都包括了:https://github.com/dennishucd/FFmpeg4Android。
另外,也可以直接搜索下载libffmpeg.so使用。考虑到流行的程度,本项目后续的开发,也是基于libffmpeg.so上,这样可以和大多数朋友保持一致。
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
呕心沥血Android studio使用JNI实例
基于ffmpeg的Android 2.2播放器开源代码
Android的NDK开发(2)————利用Android NDK编写一个简单的Hello...
android之JNI开发步骤总结
【转】Android开发手记一 NDK编程实例
史上最强NDK入门项目实战
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服