Android 下 JNI 开发Day2
02_JNI 协议
03_JNI HelloWorld-27
1、创建一个android工程;
2、java代码中写声明native方法
例如:
//声明一个本地方法
public native String helloFromC();
3、在Android工程根目录下创建jni目录,编写c代码,方法名字要对应
#include<stdio.h>
#include<stdlib.h>
//必须引入jni.h的头文件,因为后面声明的方法中,会引用到jni.h中的类型;
#include<jni.h>
/**
* Java_com_atguigu_jnihelloworld_MainActivity_helloFromC
* Java_类名(完整的类名,需要把.替换成_)_方法名
*
* JNIEnv* env:JNINativeInterface**(JNINativeInterface结构体的二级指针)
* (**env).GetVersion 调用结构体方法
* (*env).等价于env->所以(**env).等价于(*env)->
* jobject obj:java中调用此方法的对对象。当前是:MainActivity.this对象
*/
jstring Java_com_atguigu_jnihelloworld_MainActivity_helloFromC(JNIEnv* env,jobject obj){
// jstring (*NewStringUTF)(JNIEnv*, const char*);
char* text = "hello from C!!!";
//(**env).NewStringUTF(env,text);
return (*env)->NewStringUTF(env,text);
}
4、编写Android.mk文件
1、进入到工程目录下:cd /d D:\jni_workspace\JNIHelloWorld
2、输入命令:ndk-build
报错,原因是还没有Android.mk文件
查看文档android-ndk-r9/docs/ANDROID-MK.html
在jni目录创建Adroid.mk文件,把文档内容复制到文件中:
内容如下:
LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE := hello-jni LOCAL_SRC_FILES := hello-jni.c include $(BUILD_SHARED_LIBRARY)
稍微修改Android.mk如下:
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := atguigu
LOCAL_SRC_FILES := hello.c
include $(BUILD_SHARED_LIBRARY)
5、NDK编译生成动态链接库
再次执行编译命令:ndk-build
如图编译成功:
6、java代码load动态库.调用native代码
编译通过讲解 Android.mk
讲解 native代码生成的so文件存放在手机的哪个目录
加载动态库,调用native代码:
//调用C代码
//1.加载.so文件
System.loadLibrary("atguigu");
//2.调用本地方法
String result = helloFromC();
System.out.println("result=="+result);
启动对应处理器(ARM)的模拟器:
运行工程:
输入结果如下:
调用成功
#include <string.h>
#include <jni.h>
jstring Java_cn_atguigu_ndk_DemoActivity_helloFromJNI(JNIEnv *env, jobject javaThis) {
return (*env)->NewStringUTF(env, "Hello from native code!");
}
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
# Here we give our module name and source file(s)
LOCAL_MODULE := Hello
LOCAL_SRC_FILES := Hello.c
include $(BUILD_SHARED_LIBRARY)