Android JNI学习之动态注册native函数

在很久之前的一篇 Android 开发艺术探索的笔记当中,学习了简单的jni开发流程,但是那会的步骤极其繁琐复杂,而且生成的头文件函数太长,那么,有没有方法能解决呢,让开发过程变得简单易懂。当然是有的,那就是今天的主角。JNI_OnLoad函数。顺便说一下,现在as对 jni开发的支持是越来越好了。

1. 首先声明native函数

  现在,我在activity里声明了一个native函数。

public native String getStringFromC();

  然后我们build一下,为啥要build呢,这个马上就说的。

2. 创建并编写 .h头文件

  创建jni目录,并且右键->newC++class,会生出相应的.h.cpp文件,我们需要稍微修改下.h文件。

#ifndef NDK_CORE_H#define NDK_CORE_H

#define NELEM(x) ((int) (sizeof(x) / sizeof((x)[0])))

#include#include

__BEGIN_DECLS

JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM* vm, void* reserved);

JNIEXPORT void JNICALL JNI_OnUnload(JavaVM* vm, void* reserved);

__END_DECLS

#endif //TEXT_HELLO_H

  代码说明如下:

· 我们定义了一个宏NELEM,后面会用到

· 我们用JNIEXPORTJNICALL关键字,告诉虚拟机,这是jni函数,

3. 编写cpp文件

  代码如下:

jstring returnString(JNIEnv *env,jobject jobj){

char* str = "I come from C++";

return env->NewStringUTF(str);

}

static JNINativeMethod gMethods[] = {

{"getStringFromC","()Ljava/lang/String;",(void *)returnString }

};

JNIEXPORT int JNICALL JNI_OnLoad(JavaVM *vm,void *reserved) {

JNIEnv *env;

if (vm->GetEnv((void **) &env,JNI_VERSION_1_6) != JNI_OK){

return JNI_ERR;

}

jclass javaClass = env->FindClass("com/example/hello_jni/MainActivity");

if (javaClass == NULL){

return JNI_ERR;

}

if (env->RegisterNatives(javaClass,gMethods,NELEM(gMethods)) < 0) {

return JNI_ERR;

}

return JNI_VERSION_1_6;

}

  先看JNI_OnLoad方法,这是注册native函数的地方。

· 首先判断jni版本是不是JNI_VERSION_1_6

· FindClass方法找到我们对应生命native函数的类,返回一个jclass

· RegisterNatives 注册native函数,我这里用这个三个参数的方法,第一个表示对应jclass,第二个表示JNINativeMethod的数组,第三个,这个就是我们先前命名的宏,

  就这样,我们就注册了native函数了。接下来我们看下gMethods

4. JNINativeMethod数组

  这个数组里存放着这样的元素。

{"getStringFromC","()Ljava/lang/String;",(void *)returnString }

· 第一个参数对应的native方法名

· 第二个参数对应 native方法的描述,我们通过javap -s class文件路径来获取。


 第三个参数对应的是我嗯c++代码里对应的实现

  最后就是Android.mk application.mk的编写以及gradle的配置,最后编译,这里就不多说了,相关的内容下篇说明。现在给出文件内容。

android.mk

LOCAL_PATH := $(call my-dir)include $(CLEAR_VARS)LOCAL_MODULE := hello-jni

LOCAL_C_INCLUDES += $(LOCAL_PATH)LOCAL_SRC_FILES := hello.cpp

include $(BUILD_SHARED_LIBRARY)

application.mk

APP_ABI := armeabi x86APP_PLATFORM := android-14APP_STL := stlport_staticAPP_OPTIM := debug

gradle 配置


    最后就会生出so文件了。(会自动打包进apk)


来源:csdn


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值