第一个JNI程序 — Hello JNI

最近在看Android音视频相关的书籍,了解到很多地方需要用到JNI调用。以前刚开始学习Android的时候,有学习过这方面知识,也自己写过,但现在都已经忘记了,然后就上网查找,尝试自己写一个简单的demo,折腾了半天,终于实现。本文把实现的过程以及步骤记录下来,希望对正在学习的你有所帮助,也算对自己的一个学习总结

1.安装NDK工具,配置环境路径
首先第一步,安装NDK,这里大家可以参考如下博文,博主不但提供了安装方法还提供了NDK工具下载,感谢

http://blog.csdn.net/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调用,大家如果感兴趣,可以自己动手试试




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值