JNI开发注意事项
1、包含native方法的java类写在src/main/java/包名目录下
2、用javac HelloJni.java生成class文件,用javah -classpath E:\ASWorkspace\LoadImage\app\src\main\java 包名.HelloJni生成.h头文件
3、在src/main目录下新建一个jni目录,将生成的HelloJni.h文件拷贝到jni目录,jni目录右键C++ source file,命名HelloJni.cpp,实现native方法
#include <jni.h>
#include <string>
extern "C"
JNIEXPORT jstring
JNICALL
Java_com_example_loadimage_HelloJni_printStr(
JNIEnv *env,
jobject /* this */) {
std::string hello = "Hello from C++";
return env->NewStringUTF(hello.c_str());
}
4、编译工程,在app/build/intermediates/cmake/debug/obj目录生成了各平台的so文件
app目录右键新建libs文件夹,将刚刚生成的so文件拷贝到这个目录
5、在需要调用jni方法的类里面声明
static{
System.loadLibrary("HelloJni");
}
在需要调用方法的地方:
HelloJni jni = new HelloJni();
jni.printStr();
6、报错app:transformNativeLibsWithMergeJniLibsForDebug'. > Unknown file null
解决:// sourceSets.main{
// jni.srcDirs = []
// jniLibs.srcDir "src/main/libs"
// }
将上面代码注释掉,然后clean Project,再运行一下就可以了
7、在jni目录下新建Android.mk文件和Application.mk文件
Android.mk:
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := HelloJni
LOCAL_SRC_FILES := HelloJni.cpp
inclue $(BUILD_SHARED_LIBRARY)
Application.mk:
APP_STL := gnustl_shared
8、app的build.gradle同级目录新建CMakeLists.txt文件,内容如下:
cmake_minimum_required(VERSION 3.4.1)
add_library(HelloJni SHARED src/main/jni/HelloJni.cpp)
9、app的build.grdle文件里面添加
defaultConfig {
ndk{
moduleName "HelloJni"
abiFilters "armeabi","armeabi-v7a", "x86", "mips", "arm64-v8a"
}
} 就可以生成多个平台的so文件了
10、在项目的gradle.properties里添加android.useDeprecatedNdk=true
1、包含native方法的java类写在src/main/java/包名目录下
2、用javac HelloJni.java生成class文件,用javah -classpath E:\ASWorkspace\LoadImage\app\src\main\java 包名.HelloJni生成.h头文件
3、在src/main目录下新建一个jni目录,将生成的HelloJni.h文件拷贝到jni目录,jni目录右键C++ source file,命名HelloJni.cpp,实现native方法
#include <jni.h>
#include <string>
extern "C"
JNIEXPORT jstring
JNICALL
Java_com_example_loadimage_HelloJni_printStr(
JNIEnv *env,
jobject /* this */) {
std::string hello = "Hello from C++";
return env->NewStringUTF(hello.c_str());
}
4、编译工程,在app/build/intermediates/cmake/debug/obj目录生成了各平台的so文件
app目录右键新建libs文件夹,将刚刚生成的so文件拷贝到这个目录
5、在需要调用jni方法的类里面声明
static{
System.loadLibrary("HelloJni");
}
在需要调用方法的地方:
HelloJni jni = new HelloJni();
jni.printStr();
6、报错app:transformNativeLibsWithMergeJniLibsForDebug'. > Unknown file null
解决:// sourceSets.main{
// jni.srcDirs = []
// jniLibs.srcDir "src/main/libs"
// }
将上面代码注释掉,然后clean Project,再运行一下就可以了
7、在jni目录下新建Android.mk文件和Application.mk文件
Android.mk:
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := HelloJni
LOCAL_SRC_FILES := HelloJni.cpp
inclue $(BUILD_SHARED_LIBRARY)
Application.mk:
APP_STL := gnustl_shared
8、app的build.gradle同级目录新建CMakeLists.txt文件,内容如下:
cmake_minimum_required(VERSION 3.4.1)
add_library(HelloJni SHARED src/main/jni/HelloJni.cpp)
9、app的build.grdle文件里面添加
defaultConfig {
ndk{
moduleName "HelloJni"
abiFilters "armeabi","armeabi-v7a", "x86", "mips", "arm64-v8a"
}
} 就可以生成多个平台的so文件了
10、在项目的gradle.properties里添加android.useDeprecatedNdk=true