Aumentar os problemas encontrados na chamada de código nativo em java em C++
Principais erros:
- No diretório do arquivo de classe correspondente, execute o seguinte comando para gerar o arquivo de interface JNI
javah -jni com.phuket.tour.studio.Mp3Encoder
Javah foi abolido na versão superior do java e pode ser substituído por javac atualmente, usando o seguinte código para obter
javac -h 保存的位置 ./Mp3Encoder.java
// ./Mp3Encoder.java是指在当前文件夹内的Mp3Encoder.java,如果不在当前文件夹内自行添加前面的文件名称
- Execute o comando ndk-build para compilar a biblioteca so dinâmica.
O problema aqui é enorme. Existem principalmente 3 erros, todos listados abaixo. A partir do ponto 7, estou há muito tempo procurando informações para resolvê-lo.
Meu fluxograma para cada etapa:
Primeiro você precisa instalar os pacotes que deseja usar
- ndk, há muitas informações na Internet, você mesmo pode encontrar
- API do Android
- Android SDK PT e BU
- cmake
1. Crie um novo projeto
2. A primeira e a segunda etapas do livro são criar um arquivo Java e escrever um método local.
#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. Crie a pasta jni
Se não houver essa opção, crie um arquivo chamado jni diretamente no main e informe ao build.gradle que ele está no Android.
4. Gerar arquivo de interface JNI
5. Crie um arquivo cpp na pasta cpp
6. Crie o arquivo 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)
Um erro será relatado mais tarde e eu direi um a um como corrigir o erro. Primeiro, vamos ver qual erro é relatado:
7. Três perguntas
- Android NDK: APP_PLATFORM não definido. Padronizando para a versão mínima suportada android-16
Solução:
Isso exige que configuremos um Application.mk e defina APP_PLATFORM
APP_STL := c++_static
APP_CPPFLAGS := -frtti -fexceptions -std=c++0x
APP_ABI := armeabi-v7a
APP_PLATFORM := android-16
Este erro não será relatado após a execução do ndk-build uma vez.
- Android NDK: AVISO: APP_PLATFORM android-16 é superior a android:minSdkVersion 1 in D:/Android_app/mp3encoder2/app/src/main/AndroidManifest.xml. Os binários do NDK não serão compatíveis com dispositivos anteriores ao Android-16.
Solução:
Isso resolve, execute uma vez
Fonte da segunda solução: https://blog.csdn.net/jiao_mrswang/article/details/79820228
- make: *** Nenhuma regra para tornar o alvo 'D:/Android_app/mp3encoder2/app/src/main/jni/./Mp3Encoder.cpp', necessário para 'D:/Android_app/mp3encoder2/app/src/main/obj /local/armeabi-v7a/objs/jni/./Mp3
Encoder.o'. Parar.
Este problema é causado pelo LOCAL_SRC_FILES = ./Mp3Encoder.cpp neste Android.mk
Nenhuma regra para fazer alvo: a tradução significa que não há regra para criar um alvo, ou seja, este LOCAL_SRC_FILES está errado. Veja o erro e saiba it, Mp3Encoder. O endereço de cpp está errado. Na verdade, está em cpp, não em jni. Ainda não sei como corrigir o erro modificando o valor. Só consigo determinar o arquivo de destino do Android.mk por outros métodos: primeiro
exclua LOCAL_SRC_FILES = ./Mp3Encoder.cpp e depois como mostrado abaixo:
Em seguida, execute: