新建工程:
一定要把这个勾上:

在defaultConfig里加入如下代码:
ndk {
abiFilters "x86_64", "armeabi-v7a", "x86" //输出指定三种平台下的so库 可以自己决定
}
另外默认的so名称是:native-lib,也可以修改,修改步骤如下:
1:打开项目中的 app\CMakeLists.txt ,找到:
add_library( # Sets the name of the library.
native-libs
# Sets the library as a shared library.
SHARED
# Provides a relative path to your source file(s).
src/main/cpp/native-lib.cpp )
仅仅修改上面代码中,第一个native-lib以及加载库时,设定的类名字符串:
static {
System.loadLibrary("native-lib");
}
还有一个地方,下面代码第一个native-lib:
target_link_libraries( # Specifies the target library.
native-libs
# Links the target library to the log library
# included in the NDK.
${log-lib} )
注意:你要写的JNI要和自己的工程路径一样,即“System.loadLibrary("native-lib");”这个代码写在哪个类里,JNICALL的路径就是哪个,并且在该类里定义原生方法:
public native String stringFromJNI();
我的路径是“com.example.jackieyao.hellojni.MainActivity”所以,jni代码如下:
extern "C"
JNIEXPORT jstring
JNICALL
Java_com_example_jackieyao_hellojni_MainActivity_stringFromJNI(
JNIEnv *env,
jobject /* this */) {
std::string hello = "Hello from C++ dsdsf";
return env->NewStringUTF(hello.c_str());
}
build后,在“/Users/jackieyao/Downloads/HelloJNI2/app/build/intermediates/cmake”里就会出现多平台的so文件。
如果运行失败,尝试在项目的gradle里的android{...}里加入如下代码:
sourceSets {
main {
jniLibs.srcDirs = ['libs']
}
}
在MainActivity里使用如下:

网友评论