jni—编译本地方法

jni—编译本地方法

上一章有讲WAV转码Mp3,承诺过给到没有jni基础的同学讲下如何编译jni本地方法.

第一步、定义本地方法:

    public native String getLameVersion();
    //定义本地方法,关键字native
    public native void convert(String wavFile, String mp3File);
    //这里的lame是本地库的名字,build文件需要声明,下面会讲到
    static {
        System.loadLibrary("lame");
    }

    /**
     * 更新进度,供C调用,注意这里是C2Java的方法
     *
     * @param progress
     */
    public void updateProgress(int progress) {
        Message msg = new Message();
        msg.arg1 = progress;
        msg.what = 0;
        handle.sendMessage(msg);
    }

第二步、编译make project生成Class文件,这一步不能忽略,不然后面无法生成头文件!!!:


第三步、进入命令执行栏:

这里有两种方法。

第一种windows的开始菜单,搜索栏输入cmd,进入doc

第二种:进入AS中的Terminal框中编辑命令:View —>Tool Windows—>Terminal

第四步通过doc命令,生成本地方法的头文件:

cd <ProjectPath>\app\src\main      //这里的ProjectPath指的是项目的路径
javah -d jni -classpath E:\android-sdk-windows-1.5_r3\platforms\android-22\android.jar;..\..\build\intermediates\classes\debug com.example.lameonandroid.activity.Sonlist    //这里的classpath后面的参数对应的是你SDK的路径;"..\..\build\intermediates\classes\debug"就是上面第二步JVM编译生成Class文件的路径,至于后面跟着的则是声明本地方法的类名。

这一步之后将会在jni中生成本地方法的头文件,名字就是对应的全类名:

第五步、生成头文件之后你就可以在jni中写你的本地方法内容了即.c的文件,注意函数名必须跟头文件中的一致,不然会报错,要具体实现函数,还需要声明头文件:

.h头文件函数名:
JNIEXPORT void JNICALL Java_com_example_lameonandroid_activity_SongList_convert
  (JNIEnv *, jobject, jstring, jstring);
.c文件函数名:
JNIEXPORT void JNICALL Java_com_example_lameonandroid_activity_SongList_convert
(JNIEnv * env, jobject obj, jstring jwav, jstring jmp3)
注意不要被红色标记部分吓到哦,这里不是报错,是因为AS不具备C文件错误检索功能,这里确实很蛋疼,而且如果你jni中的没有出现下面这种情况,恰恰说明你写的东西有问题大笑,是不是很坑。

声明头文件:
#include "com_example_lameonandroid_activity_SongList.h"

第六步、到了这一步我们才能将外部的库复制到jni中,不然没法编译通过的,放进去就可以写C层的代码了。

第七步、这一步很重要,也很容易忽略,需要在gradle中声明本地库:


"abiFilters"后面的参数是声明不同内核生成对应版本的so库。
又到尾声了,按着这七步来走,编译方面就Ok,至于代码错误就看各位的C功底了,至少不用担心最后编译不了so库,不然就那个啥疼了!!!偷笑

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值