NDK的基础教程 四 动态注册

来源:互联网 发布:最短路径的算法 编辑:程序博客网 时间:2024/06/10 19:42

NDK的使用分为两种静态注册和动态注册
在静态注册的时候,我们会对目标类做javah -jni操作,生产对应的.h的头文件,在cpp文件中使用头文件中自动给我们生成好的C++方法名。
而动态注册就是将两个函数联系起来,比如我们现在希望当我们调用JNIDynamicUtils的getHelloStringFromJNI方法时调用这个native_hello函数,它不需要对应目标类生成h后缀的头文件
使用例子如下:

public class MainActivity extends ActionBarActivity {    private TextView mTextView;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        mTextView = (TextView) findViewById(R.id.test);        mTextView.setText(JNIDynamicUtils.getSumFromJNI(11,22));    }}
public class JNIDynamicUtils {    public static native String getSumFromJNI(int i1, int i2);    static {        System.loadLibrary("myNativeLib");    }}
#include <stdio.h>#include <jni.h>#include <stdlib.h>jstring calcSum(JNIEnv *env, jclass clazz, jint i1, jint i2) {    char result[50];    sprintf(result, " this is string from jni. result is %d", (i1 + i2));    return env->NewStringUTF(result);}/** * JNINativeMethod由三部分组成: * (1)Java中的函数名; * (2)函数签名,格式为(输入参数类型)返回值类型; *  ()Ljava/lang/String; (II)表示需要传两个int型参数,Ljava/lang/String;表示返回String,在对象类名(包括包名,‘/’间隔)前面加L,分号结尾 * (3)native函数名 */static JNINativeMethod gMethods[] = { {"getSumFromJNI", "(II)Ljava/lang/String;", (void *)calcSum }};//System.loadLibrary过程中会自动调用JNI_OnLoad,在此进行动态注册JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM *jvm, void *reserved) {    JNIEnv *env = NULL;    jint result = JNI_FALSE;    //获取env指针    if (jvm->GetEnv((void**) &env, JNI_VERSION_1_6) != JNI_OK) {        return result;    }    if (env == NULL) {        return result;    }    //获取类引用    jclass clazz = env->FindClass("io/github/yanbober/ndkapplication/JNIDynamicUtils");    if (clazz == NULL) {        return result;    }    //注册方法    if (env->RegisterNatives(clazz, gMethods, sizeof(gMethods) / sizeof(gMethods[0])) < 0) {        return result;    }    //成功    result = JNI_VERSION_1_6;    return result;}

对于JNI_OnLoad这个函数他很特殊,它是系统规定必须这样写的,系统调用它的时机也是固定的,我们需要再这个函数里将这个函数联系起来

再见,下一次我自己设计一个比较大的例子,侧重使用C++

原创粉丝点击