NDK学习之------静态注册

  • 静态注册:在java层使用jni接口获取c层定义的一个字符

  • 区分动态注册:动态注册会使用到JNI_onload类里面有个注册函数

  •  

  1. 第一步先新建一个安卓工程,其余默认值,然后创建一个新的安卓工程
  2. 其中主类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();
    }
    
  3. 然后使用命令行进入工程的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
    
  4. 使用eclipse提供的功能,然后会生成一个jni目录,目录下有Android.mk文件和一个只包含了头文件的cpp文件
  5. 其中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)

     

  6. Application.mk文件如下
    APP_ABI := all
    APP_STL := stlport_static 

     

  7. 编写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;
    }
    

     

  8. 然后打包安装,运行效果如下
  9. 如果编译有问题,需要检查ndk是否配置,代码编写是否有误,要学会如何解决问题
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值