如上节所属,我们已经配置好了NDK环境,实现了简单的jni调用,生成了对应的动态库.so文件,这里就测试下在另外一个应用中调用这个.so文件。
1.找到需要的.so文件。
如上节所述,通过编译,在app/build/intermediates/ndk下生成了编译后的文件,在debug文件夹下lib文件夹的内容就是所需的.so文件,文件目录如下:
2.新建项目并导入.so文件
将上图三个文件夹放在app下的libs文件夹中,并在APP的build.gradle中配置jni的文件路径,配置在与buildTypes同级下,如图:
/**
* 关于。so的配置
*/
sourceSets{
main{
jniLibs.srcDirs = ['libs']
}
}
3.调用该.so文件的Java类的创建:
需要注意的是这里的Java类的类名报名和方法名需要和生成.so文件的.c/.c++文件中描述的相同,如我的c文件内容如下:
,呢么我在新建类的时候包名和类名也要是com.example.testndk1.JniManage,方法名也要是getStringByJni,具体代码如下:// // Created by 石博 on 2017/3/22. // #include <jni.h> #include <android/log.h> #ifndef LOG_TAG #define LOG_TAG"ANDROID_LAB" #define LOGE(...) __android_log_print(ANDROID_LOG_ERROR,LOG_TAG,__VA_ARGS__) #endif /* Header for class lab_sodino_jnitest_MainActivity */ #ifndef _Included_com_example_shibo_testndk1_JniManage #define _Included_com_example_shibo_testndk1_JniManage #ifdef __cplusplus extern "C" { #endif /* * Class:lab_sodino_jnitest_MainActivity * Method: getStringFromNative * Signature: ()Ljava/lang/String; */ JNIEXPORT jstring JNICALL Java_com_example_shibo_testndk1_JniManage_getStringByJni (JNIEnv *env, jobject jObj){ LOGE("log string from ndk."); return (*env)->NewStringUTF(env,"HelloFrom JNI!"); } #ifdef __cplusplus } #endif #endif
package com.example.shibo.testndk1; /** * Created by shibo on 2017/3/22. */ public class JniManage { static { System.loadLibrary("testNdk"); } public native String getStringByJni(); }
4.测试
让JniManage进行jni调用,并在控制台输出log,测试完成。