Android jni 静态注册 和动态注册

JNI 开发流程

1.编写native 方法
2.javah 命令,生成.h 文件 
  java_类的全名_方法名
   或者自己手写
  
3.复制.h 头文件到cpp 工程
4.复制jni.h 和jni_md.h
5.实现.h 头文件中的声明函数
6.生成一个dll 动态库
7.在java中加载动态库
8.触发native函数



静态注册:
(1)编写native方法


public class FileUtils {


    public native static  void diff(String path, String pattern_Path, int file_num);


    public native static  String getString();


    public native String getNoStaticString();


    public String key= "key";


    public native String accessField();


    /**
     * 通过 这个方法来触发,jni 调用
     * getRandeomUUId 这个静态方法
     */
    public native void getStaticString();


    //访问构造方法
    public native Date acceessConstructor();


    //访问构造方法
    public native String getStudentName();
    // 中文的处理
    public native String chineseChars(String str);


    // Used to load the 'native-lib' library on application startup.
    static {
        System.loadLibrary("native-lib");
    }


}

(2)生成.h文件

#include <jni.h>
/* Header for class com_zack_banner_FileUtils */


#ifndef _Included_com_zack_banner_FileUtils
#define _Included_com_zack_banner_FileUtils
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     com_zack_banner_FileUtils
 * Method:    diff
 * Signature: (Ljava/lang/String;Ljava/lang/String;I)V
 */
JNIEXPORT void JNICALL Java_com_zack_banner_FileUtils_diff
  (JNIEnv *, jclass, jstring, jstring, jint);


#ifdef __cplusplus
}
#endif
#endif

(3)静态注册的c方法
JNIEXPORT void JNICALL Java_com_zack_banner_FileUtils_diff
  (JNIEnv *, jclass, jstring, jstring, jint)
{

}

(4)动态注册



/*,
{
"getString","()Ljava/langString;",(void*)native_java_str
}*/
static  const JNINativeMethod getMethod[]= {
        {
           "diff", "(Ljava/lang/String;Ljava/lang/String;I)V", (void *) native_zack_diff
        }
        ,{
            "getString","()Ljava/lang/String;",(void*)native_java_str
        }
        ,{
             "getNoStaticString","()Ljava/lang/String;",(void*)native_no_static
        },
        {
                "accessField","()Ljava/lang/String;",(void*)change_zack_key
        },
        {
                "chineseChars","(Ljava/lang/String;)Ljava/lang/String;",(void*)getchineseChars
        },
        {
                "acceessConstructor","()Ljava/util/Date;",(void*)zack_getDate
        },
        {
                "getStudentName","()Ljava/lang/String;",(void*)zack_getStudentName
        }
};


static int registerNatives(JNIEnv* engv)
{
    LOGI("registerNatives begin");
    jclass  clazz;
    clazz = (*engv) -> FindClass(engv, "com/zack/banner/FileUtils");


    if (clazz == NULL) {
        LOGI("clazz is null");
        return JNI_FALSE;
    }


    if ((*engv) ->RegisterNatives(engv, clazz, getMethod, NELEM(getMethod)) < 0) {
        LOGI("RegisterNatives error");
        return JNI_FALSE;
    }


    return JNI_TRUE;
}
//JNI_OnLoad
JNIEXPORT jint JNI_OnLoad(JavaVM *vm,void* reserved){
    LOGI("jni_OnLoad begin");


    JNIEnv* env = NULL;
    if ((*vm)->GetEnv(vm,(void**) &env, JNI_VERSION_1_4) != JNI_OK) {
        LOGI("ERROR: GetEnv failed\n");
        return -1;
    }
    assert(env != NULL);
    registerNatives(env);
    return  JNI_VERSION_1_4;
}

(5)触发
public class MainActivity extends AppCompatActivity {


    private String TAG="zack";


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);


        diff();


        TextView tvTest= (TextView) findViewById(R.id.tv_test);
        FileUtils fileUtils=new FileUtils();
        StringBuffer stb=new StringBuffer();
        stb.append(FileUtils.getString()).append("\n");
        stb.append(fileUtils.getNoStaticString()).append("\n");
        stb.append("change before key: " + fileUtils.key).append("\n");
        fileUtils.accessField();
        stb.append("after change, Key:  " + fileUtils.key).append("\n");
        stb.append(fileUtils.acceessConstructor()).append("\n");
        stb.append(fileUtils.getStudentName());




        tvTest.setText(stb);


        System.out.println(fileUtils.chineseChars("她的背影"));
//        fileUtils.accessField();
//        System.out.println("after change, Key:  " + fileUtils.key);




    }
    public void diff() {


        Log.d(TAG, "diff begin");
        FileUtils.diff("x","s",3);
    }




}

下载链接 (eclipse android stuido 都有)
http://download.csdn.net/download/xue9052zhou/9932116
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值