增加C++中java曾调用Native代码中遇到的问题
主要的错误:
- 在对应的class文件的目录下,执行下面的命令生成JNI接口文件
javah -jni com.phuket.tour.studio.Mp3Encoder
javah在高版本的java中已经废除了,目前可以用javac代替,用以下代码实现
javac -h 保存的位置 ./Mp3Encoder.java
// ./Mp3Encoder.java是指在当前文件夹内的Mp3Encoder.java,如果不在当前文件夹内自行添加前面的文件名称
- 执行ndk-build指令,编译出该动态so库。
这里问题巨大,主要有3个错误,都放在下面了,在第7点开始,我找了好久的资料在解决。
我每一步的流程图:
首先你要先安装要用的包
- ndk,网上有很多资料,可以自己去找
- Andriod API
- Android SDK PT 和 B U
- 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. 三个问题
- 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就不会报这个错了。
- 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
- 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,然后如下图:
然后运行: