-
静态注册:在java层使用jni接口获取c层定义的一个字符
-
区分动态注册:动态注册会使用到JNI_onload类里面有个注册函数
-
- 第一步先新建一个安卓工程,其余默认值,然后创建一个新的安卓工程
- 其中主类MainActivity.java如下
public class MainActivity extends Activity { static { //不要忘记加载so文件啊 System.loadLibrary("jni_study"); } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //Toast显示getString函数的返回值 Toast.makeText(this, getString(), 2000).show(); } //native函数调用jni层 public native String getString(); }
- 然后使用命令行进入工程的src目录下。. 使用命令javah -jni <native函数所在类名>,然后生成.h头文件
//命令如下 javah -jni com.ldj.leanndk001.MainActivity //生成如下代码 /* DO NOT EDIT THIS FILE - it is machine generated */ #include <jni.h> /* Header for class com_ldj_leanndk001_MainActivity */ #ifndef _Included_com_ldj_leanndk001_MainActivity #define _Included_com_ldj_leanndk001_MainActivity #ifdef __cplusplus extern "C" { #endif /* * Class: com_ldj_leanndk001_MainActivity * Method: getString * Signature: ()Ljava/lang/String; */ JNIEXPORT jstring JNICALL Java_com_ldj_leanndk001_MainActivity_getString (JNIEnv *, jobject); #ifdef __cplusplus } #endif #endif
- 使用eclipse提供的功能,然后会生成一个jni目录,目录下有Android.mk文件和一个只包含了头文件的cpp文件
- 其中Android.mk文件如下
LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_CFLAGS += -pie -fPIE LOCAL_LDFLAGS += -pie -fPIE LOCAL_MODULE := jni_study //模块名 LOCAL_SRC_FILES := jni_study.cpp //cpp文件 LOCAL_ARM_MODE := arm LOCAL_LDLIBS += -llog include $(BUILD_SHARED_LIBRARY)
- Application.mk文件如下
APP_ABI := all APP_STL := stlport_static
- 编写jni_study.cpp ,将之前第三步生成的.h头文件修改名称为jni_study.h
#include "jni_study.h" JNIEXPORT jstring JNICALL Java_com_ldj_leanndk001_MainActivity_getString (JNIEnv * env, jobject obj){ jstring str = env->NewStringUTF("这是JNI"); return str; }
- 然后打包安装,运行效果如下
- 如果编译有问题,需要检查ndk是否配置,代码编写是否有误,要学会如何解决问题