最近在看Android音视频相关的书籍,了解到很多地方需要用到JNI调用。以前刚开始学习Android的时候,有学习过这方面知识,也自己写过,但现在都已经忘记了,然后就上网查找,尝试自己写一个简单的demo,折腾了半天,终于实现。本文把实现的过程以及步骤记录下来,希望对正在学习的你有所帮助,也算对自己的一个学习总结
1.安装NDK工具,配置环境路径
首先第一步,安装NDK,这里大家可以参考如下博文,博主不但提供了安装方法还提供了NDK工具下载,感谢
http://blog.youkuaiyun.com/hxl5955/article/details/51698762
2.新建一个安卓项目,命名为MP3Encoder,完成以后右击该项目 — Android Tools — Add Native Support
3.新建一个Java文件Mp3Encoder.java,在该文件编写一个本地方法
package com.example.mp3encoder;
public class Mp3Encoder {
public static native void encode();
}
4.在Windows环境下编译h头文件进入应用工程目录(I:\workspace\MP3Encoder)输入如下命令编译h头文件
javah -classpath bin/classes -d . com.example.mp3encoder.Mp3Encoder
该命令执行完毕会生成一个com_example_mp3encoder_Mp3Encoder.h文件,然后新建jni目录,将此文件放进去
5.在jni目录下新建一个Mp3Encoder.cpp文件,内容如下
#include "com_example_mp3encoder_Mp3Encoder.h"
#include <stdio.h>
#include <jni.h>
#include <android/log.h>
#include <string.h>
#define LOG_TAG "native-call"
#define LOGI(...) __android_log_print(ANDROID_LOG_INFO, LOG_TAG, __VA_ARGS__)
JNIEXPORT void JNICALL Java_com_example_mp3encoder_Mp3Encoder_encode
(JNIEnv *, jobject){
LOGI("MP3 encoder");
}
6.接下来在该目录下新建一个Android.mk文件和application.mk文件,内容如下
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_SRC_FILES := ./Mp3Encoder.cpp
LOCAL_LDLIBS := -L$(SYSROOT)/user/lib -llog
LOCAL_MODULE := libaudioencoder
include $(BUILD_SHARED_LIBRARY)
APP_ABI := armeabi armeabi-v7a x86
APP_PLATFORM := android-14
7.完成上面步骤以后,我们要在当前目录下执行ndk-build指令,编译出该动态so库
8.最后我们需要在MainActivity中写一个静态代码块,加载由上一步编译出来的so库,然后我们在代码里就可以调用该方法了,代码如下
package com.example.mp3encoder;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
public class MainActivity extends Activity {
private Button mCallJniButton;
static {
System. loadLibrary("audioencoder"); //加载so动态链接库
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mCallJniButton = (Button) findViewById(R.id.call_jni);
mCallJniButton.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO 自动生成的方法存根
Mp3Encoder.encode();
}
});
}
}
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.example.mp3encoder.MainActivity" >
<Button
android:id="@+id/call_jni"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="调用本地JNI方法" />
</RelativeLayout>
按照上述过程便可以实现一个简单的jni调用,大家如果感兴趣,可以自己动手试试