Android Studio在音视频开发进阶指南中的Mp3Encoder中遇到的问题

增加C++中java曾调用Native代码中遇到的问题

主要的错误:

  1. 在对应的class文件的目录下,执行下面的命令生成JNI接口文件
javah -jni com.phuket.tour.studio.Mp3Encoder

javah在高版本的java中已经废除了,目前可以用javac代替,用以下代码实现

javac -h 保存的位置 ./Mp3Encoder.java
// ./Mp3Encoder.java是指在当前文件夹内的Mp3Encoder.java,如果不在当前文件夹内自行添加前面的文件名称
  1. 执行ndk-build指令,编译出该动态so库。
    这里问题巨大,主要有3个错误,都放在下面了,在第7点开始,我找了好久的资料在解决。

我每一步的流程图:

首先你要先安装要用的包

  1. ndk,网上有很多资料,可以自己去找
  2. Andriod API
  3. Android SDK PT 和 B U
  4. cmake
    在这里插入图片描述

在这里插入图片描述

1. 创建新项目

在这里插入图片描述
在这里插入图片描述

2.书上的第一步和第二步,建立Java文件,以及写入一个本地方法。

#define LOGI(...) __android_log_print(ANDROID_LOG_INFO,LOG_TAG, __VA_ARGS__)
        Java_com_phuket_tour_mp3encoder_MpeEncoder_encode(JNIEnv * env, jobject obj) {
    
    
    LOGI("encoder encode");
}

在这里插入图片描述
在这里插入图片描述

3. 创建jni文件夹

在这里插入图片描述
如果没有这个选项就直接在main里面创建一个名叫jni的文件,并告诉build.gradle,这个是在Android的。
在这里插入图片描述

4. 生成JNI接口文件

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

5. 在cpp文件夹内创建一个cpp文件

在这里插入图片描述

6. 创建Android.mk文件

LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_SRC_FILES = ./Mp3Encoder.cpp
LOCAL_LDLIBS :=-L$(SYSROOT)/usr/lib -llog
LOCAL_MODULE := jni
include $(BUILD_SHARED_LIBRARY)

在这里插入图片描述
后面会报错,我会逐个逐个告诉你们怎么把错误改了,先看看报什么错:
在这里插入图片描述
在这里插入图片描述

7. 三个问题

  1. Android NDK: APP_PLATFORM not set. Defaulting to minimum supported version android-16

解决方法:
这个需要我们设置一个Application.mk,并设置APP_PLATFORM

APP_STL := c++_static
APP_CPPFLAGS := -frtti -fexceptions -std=c++0x
APP_ABI := armeabi-v7a
APP_PLATFORM := android-16

在这里插入图片描述
在运行一次ndk-build就不会报这个错了。

  1. Android NDK: WARNING: APP_PLATFORM android-16 is higher than android:minSdkVersion 1 in D:/Android_app/mp3encoder2/app/src/main/AndroidManifest.xml. NDK binaries will not be compatible with devices older than android-16.

解决方法:
在这里插入图片描述
在这里插入图片描述
这样就解决了,在运行一次
在这里插入图片描述第二个解决方法的来源:https://blog.csdn.net/jiao_mrswang/article/details/79820228

  1. make: *** No rule to make target ‘D:/Android_app/mp3encoder2/app/src/main/jni/./Mp3Encoder.cpp’, needed by ‘D:/Android_app/mp3encoder2/app/src/main/obj/local/armeabi-v7a/objs/jni/./Mp3
    Encoder.o’. Stop.

这个问题是由这个Android.mk中的LOCAL_SRC_FILES = ./Mp3Encoder.cpp导致的
No rule to make target :翻译过来就是不存在创建目标的规则,也就是这个LOCAL_SRC_FILES是错误的看报错也知道了,Mp3Encoder.cpp的地址不对,实在cpp内的,不是在jni里面的。我现在还不知道怎么通过修改值来矫正错误,我只能通过其他的方法决定Android.mk的目标文件:
先删除LOCAL_SRC_FILES = ./Mp3Encoder.cpp,然后如下图:
在这里插入图片描述
在这里插入图片描述
然后运行:
在这里插入图片描述
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/A_easy_learner/article/details/123296704