环境基本上是搭建好了,就可以开始开发了。
先写一个java文件
package zhaozx; /** * Created by zhaozx on 2017/6/6. * desc: */ public class JniTest { /** * 将用C++代码实现,在android代码中调用的方法:获取当前app的包名 * @return */ public static native String getPackname(); /** * 加载so库或jni库,在使用到该库之前加载就行,不一定非要写在这个类内 * 系统自己会判断扩展名是dll还是so,这里加载libapp.so */ static { System.loadLibrary("app"); } }接下来是比较重要的步骤,使用javah根据java文件生成c/c++的.h头文件 1.进入app/src/main目录 2.使用 javah -d jni -classpath ./Java 包名+类名(我的是zhaozx.JniTest),生成zhaozx_JniTest.h文件, 此文件在main/jni的目录下, -d jni 就是在当前目录(main)下创建jni文件夹。 我的zhaozx_JniTest.h文件的内容为
/* DO NOT EDIT THIS FILE - it is machine generated */ #include <jni.h> /* Header for class zhaozx_JniTest */ #ifndef _Included_zhaozx_JniTest #define _Included_zhaozx_JniTest #ifdef __cplusplus extern "C" { #endif /* * Class: zhaozx_JniTest * Method: getPackname(方法名) * Signature: (Ljava/lang/Object;)Ljava/lang/String; */ JNIEXPORT jstring JNICALL Java_zhaozx_JniTest_getPackname (JNIEnv *, jclass); #ifdef __cplusplus } #endif #endif参照zhaozx_JniTest.h文件在jni目录下创建对应的zhaozx_JniTest.cpp文件,我的文件内容为
// // Created by Apple on 2017/6/6. // #include <stdio.h> #include <jni.h> #include <stdlib.h> #include "zhaozx_JniTest.h" JNIEXPORT jstring JNICALL Java_zhaozx_JniTest_getPackname (JNIEnv *env, jclass cls){ return (env)->NewStringUTF((char *)"Hello from JNI !"); /** 此处根据文件后缀写法不同 .cpp的写法return (env)->NewStringUTF((char *)"Hello from JNI !"); .c的写法return (*env)->NewStringUTF(env, "Hello from JNI !"); */ }在app/build.gradle文件中加入
defaultConfig { applicationId "com.learnrn" minSdkVersion 16 targetSdkVersion 22 versionCode 1 versionName "1.0" // 生成不同平台的.so文件 +ndk { + abiFilters "armeabi-v7a", "x86" +} }在jni目录中还需要加入两个文件Android.mk和Application.mk。 Android.mk的内容
LOCAL_PATH := $(call my-dir) // 设置当前的编译目录(Android.mk所在的目录) include $(CLEAR_VARS) // 清除LOCAL_XX变量(LOCAL_PATH除外) LOCAL_MODULE := TEST_JNI // 指定当前编译模块的名称(不过貌似没用额,总是生成libapp.so文件) LOCAL_SRC_FILES := jnitest.cpp // 编译模块需要的源文件 include $(BUILD_SHARED_LIBRARY) // 指定编译出的库类型,BUILD_SHARED_LIBRARY:动态库;//BUILD_STATIC_LIBRARY:静态库, BUILD_EXECUTEABLE指:可执行文件Application.mk的内容
APP_ABI := all做完这些后就大工告成,在AS中rebuild项目。
会发现这个目录下会多出.so文件。
.so文件已经生成,接下来就是如何使用了,在需要调用的地方创建对象并使用方法即可,如:
JniTest j = new JniTest(); Log.e("我要成功", j.getPackname());结果
目前想到的就这么多了,谢谢大家哈!