使用步骤
一、定义本地方法,通常情况下,应单独定义一个类来封装所有native方法
/** 存放native方法的类 */ public class MyNativeMethods { private static MyNativeMethods mEmployee; private MyNativeMethods() { } public static MyNativeMethods getInstance() { if (mEmployee == null) { mEmployee = new MyNativeMethods(); } return mEmployee; } //相当于在java代码中定义了一个接口,然后用C语言实现了此接口 public native String helloFromC(); public native int passwordFromC(int x, int y); } |
#include <stdio.h> #include <stdlib.h> #include <jni.h>//必须添加的头文件 jstring Java_com_bqt_hellofromc_MyNativeMethods_helloFromC(JNIEnv* env, jobject obj) { //【返回值】【方法名】【参数列表】返回值类型jstring就是java中的string char* cstr = "hello from c"; // char* 在c中可用来表示一个字符串。注意,这里绝对不能有中文 jstring jstr = (*env)->NewStringUTF(env, cstr); return jstr; } JNIEXPORT jint JNICALL Java_com_bqt_hellofromc_MyNativeMethods_passwordFromC(JNIEnv *env, jobject obj, jint a, jint b) { return a + b + 10000; //c中的int占用字节数在不同环境下可能不同,可能是0-65535,所以,稍微大一点的数(十万级别)都得用double } |
LOCAL_PATH := $(call my-dir) # C/C++代码所在目录,也就是我们的jni目录,不必修改 include $(CLEAR_VARS) LOCAL_MODULE := hello # 对应打包成函数库的名字,编译器会自动在前面加上lib,在后面加上.so,最终结果就是libhello.so LOCAL_SRC_FILES := hello.c # 对应的c代码的文件名,即hello.c include $(BUILD_SHARED_LIBRARY) |
cd ../.. cd cygdrive/ cd d/Users/Android_workspace/HelloFromC ndk-build |
cd/d D:\Users\Android_workspace\HelloFromC ndk-build |
APP_ABI := armeabi armeabi-v7a x86 #Application.mk文件的目的是,描述在你的应用程序中所有需要的模块(即静态库或动态库) #APP_ABI 的值以空格区分,代表要支持的架构,默认值为【armeabi】。其他架构,ARMv7 【armeabi-v7a】;IA-32【 x86】 #每增加一个架构,编译后都会在lib目录下生成一个相应的文件夹,文件夹下的文件都是同名的.so文件(当然文件内容不一样) |
static { System.loadLibrary("hello");// 在java代码中引入libs目录下的库函数,文件名为【libhello.so】。注意,引入时的文件名要去掉前面的lib和后面的.so } String stringFromC = MyNativeMethods.getInstance().helloFromC(); int intFromC = MyNativeMethods.getInstance().passwordFromC(1, 2); |
附件列表
时间: 2024-10-06 03:07:15