如何写JNI

JNI中包括java和c两部分

这2部分虽然不是完全独立,但可以分开实现

 

java部分

1、载入动态库

     static {
        System.loadLibrary("jni");
     }

     //注意这个字符串,如果这个字符串是 xx  那么c那边要生成的库文件名要对应是 libxx.so

2、声明native 方法

     native public  String getJni();

     //其中方法名也要注意 和 c部分对应(与gMethods中的字符串对应)

 

java部分比较简单 只要注意字符串的对应就可以了

//~~~~~~~~~~~~~~~~~~NativeDynamic.java

package com.karl.jni;

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.Toast;

public class NativeDynamic extends Activity {

    static {
        System.loadLibrary("jni");
    }

    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
    }

    native public  String getJni();

    public void getDynamic(View view) {
        Toast.makeText(this, getJni(), Toast.LENGTH_SHORT).show();
    }
}

 

C部分

一、代码

        1、JNI载入的入口函数----JNI_OnLoad  其中调用了注册方法函数

        2、注册方法函数---registerMethods 主要注意类名字符串的匹配  其中调用了 方法函数

        3、方法函数----gMethods 类似map的一个对应函数 把java和c的函数配对 注意方法名的字符串匹配

二、编译

        Android.mk文件

        LOCAL_PRELINK_MODULE = false  这个要注意

 

 

//~~~~~~~~~~~~~~~~~~~~~~~~~~~~jni.cpp

 

#define LOG_TAG "NativeDynamicLibrary"
#include "utils/Log.h"

#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <assert.h>

#include "jni.h"

static jstring Get_Jni(JNIEnv* env, jclass clazz) {
 
    return env->NewStringUTF("string from get_jni");
}

static const JNINativeMethod gMethods[] = {
    { "getJni",      "()Ljava/lang/String;",
                        (void*)Get_Jni },

};

static int registerMethods(JNIEnv* env) {
    static const char* const kClassName =
        "com/karl/jni/NativeDynamic";
    jclass clazz;

    /* look up the class */
    clazz = env->FindClass(kClassName);
    if (clazz == NULL) {
        LOGE("Can't find class %s/n", kClassName);
        return -1;
    }

    /* register all the methods */
    if (env->RegisterNatives(clazz, gMethods,
            sizeof(gMethods) / sizeof(gMethods[0])) != JNI_OK)
    {
        LOGE("Failed registering methods for %s/n", kClassName);
        return -1;
    }

    return JNI_TRUE;
}



jint JNI_OnLoad(JavaVM* vm, void* reserved) {
    JNIEnv* env = NULL;
    jint result = -1;

    if (vm->GetEnv((void**) &env, JNI_VERSION_1_4) != JNI_OK) {
        LOGE("ERROR: GetEnv failed/n");
        goto bail;
    }
    assert(env != NULL);

    if (registerMethods(env) != JNI_TRUE) {
        LOGE("ERROR:native registration failed/n");
        goto bail;
    }

    /* success -- return valid version number */
    result = JNI_VERSION_1_4;

bail:
    return result;
}

 

 

//~~~~~~~~~~~~~~~~Android.mk

LOCAL_PATH:= $(call my-dir)

#----------------------------------------------------------------------
include $(CLEAR_VARS)

LOCAL_MODULE_TAGS := optional

LOCAL_MODULE := libjni

LOCAL_SRC_FILES := /
    jni.cpp

LOCAL_SHARED_LIBRARIES := /
    libandroid_runtime /
    libnativehelper /
    libcutils /
    libutils

LOCAL_C_INCLUDES += /
    $(JNI_H_INCLUDE) /
    $(LOCAL_PATH)/../include

LOCAL_CFLAGS += /
    -O

LOCAL_PRELINK_MODULE := false

include $(BUILD_SHARED_LIBRARY)

 

//~~~~~~~~~~~~~~~~~~~~~make -j 8 libjni    这样就可以生成对应的libjni.so 文件

 

 

 

 

//然后把libjni.so 文件 push到system/lib目录下

运行apk文件就可以了

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值