Java教程

NDK项目的简单构建

2017-08-01  本文已影响36人  daking

基本概念

JNI

NDK

加载本地库

Native方法

Java类中声明native方法

package com.daking.jni;
    
public class JNIUtil {
    static {
        System.loadLibrary("nativecode"); // 加载libnativecode.so
    }
    public static native String getLibName();
}

1. 函数命名规则来匹配和映射Native方法

JNIEXPORT 返回类型 JNICALL Java_{packageName}_{className}_{functionName}(jni参数列表);
JNIEXPORT jstring JNICALL Java_com_daking_jni_JNIUtil_getLibName(JNIEnv* env, jobject obj);

2. 运行时动态注册Native方法

jstring getLibName(JNIEnv* env, jobject obj) {
    return (*env)->NewStringUTF(env, "hello world!");
}
static JNINativeMethod jniMethods[] = {
    {"getLibName", "()Ljava/lang/String;", (void*)getLibName}
    // 其他Java本地方法与C Native方法的映射...
};
static const char* className = "com/daking/jni/JNIUtil";
    
int JNI_OnLoad(JavaVM *vm, void *reserved) {
    JNIEnv *env;
    if ((*vm)->GetEnv(vm, (void **)&env, JNI_VERSION_1_4) != JNI_OK) {
        return JNI_ERR;
    }
    
    jclass cls = (*env)->FindClass(env, className);
    if (cls == NULL)
        return JNI_ERR;
        
    int len = sizeof(jniMethods) / sizeof(jniMethods[0]);
    (*env)->RegisterNatives(env, cls, jniMethods, len);
    
    return JNI_VERSION_1_4;
}

NDK Sample Project

1. 创建Android项目

package com.daking.jni;
    
public class JNIUtil {
    static {
        System.loadLibrary("nativecode");
    }
    public static native String getLibName();
}

2. 创建JNI项目

JNIDemo
├── jni
│   ├── Android.mk
│   ├── Application.mk
│   ├── include
│   │   └── api.h
│   └── src
│       └── api.c
#include <jni.h>
#ifndef NATIVECODE_API_H
#define NATIVECODE_API_H
        
#ifdef __cplusplus
extern "C" {
#endif
        
JNIEXPORT jstring JNICALL
Java_com_daking_jni_JNIUtil_getLibName(JNIEnv*, jobject);
        
#ifdef __cplusplus
}
#endif
#endif //NATIVECODE_API_H
#include "api.h"
#include <stdio.h>
        
JNIEXPORT jstring JNICALL
Java_com_daking_recyclerdemo_jni_getLibName(JNIEnv* env, jobject thiz) {
    return (*env)->NewStringUTF(env, "libnativecode.so");
}
LOCAL_PATH := $(call my-dir)
        
include $(CLEAR_VARS)
        
LOCAL_MODULE := nativecode
LOCAL_C_INCLUDES := $(LOCAL_PATH)/include
LOCAL_SRC_FILES := ./src/api.c
include $(BUILD_SHARED_LIBRARY)
APP_ABI := armeabi

3. Android项目引用so库

我的博客

上一篇 下一篇

猜你喜欢

热点阅读