java代码调用C代码 JNI
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java代码调用C代码 JNI相关的知识,希望对你有一定的参考价值。
1 定义一个c方法的接口 相当于在java代码中定义了一个接口 接口的实现方法是C语言实现的
public native int login(String password);
2 实现C代码
在android工程的目录的src下,可以使用命令: (javah -jni 全类名 )来生成对应C语言函数的头文件
#include <stdio.h>
#include "com_qushaohui_aliwangwang_MainActivity.h"
int login(char* psw){
char* rightPwd = "123";
if(strcmp(psw,rightPwd)){
return 302;
}else{
return 200;
}
}
char* Jstring2CStr(JNIEnv* env, jstring jstr)
{
char* rtn = NULL;
jclass clsstring = (*env)->FindClass(env,"java/lang/String");
jstring strencode = (*env)->NewStringUTF(env,"GB2312");
jmethodID mid = (*env)->GetMethodID(env,clsstring, "getBytes", "(Ljava/lang/String;)[B");
jbyteArray barr= (jbyteArray)(*env)->CallObjectMethod(env,jstr,mid,strencode); // String .getByte("GB2312");
jsize alen = (*env)->GetArrayLength(env,barr);
jbyte* ba = (*env)->GetByteArrayElements(env,barr,JNI_FALSE);
if(alen > 0)
{
rtn = (char*)malloc(alen+1); //"\0"
memcpy(rtn,ba,alen);
rtn[alen]=0;
}
(*env)->ReleaseByteArrayElements(env,barr,ba,0); //
return rtn;
}
JNIEXPORT jint JNICALL Java_com_qushaohui_aliwangwang_MainActivity_login
(JNIEnv * env, jobject obj, jstring str)
{
char* c = Jstring2CStr(env,str);
return login(c);
}
3 告诉编译器 如何把c代码打包成函数库,生成 Android.mk文件
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
# 对应打包成函数库的名字
LOCAL_MODULE := hello
# 对应c代码的文件
LOCAL_SRC_FILES := Hello.c
include $(BUILD_SHARED_LIBRARY)
4 把c代码 打包成函数库 用到了安装的环境
执行命令ndk-build
5 步在java代码中 引入库函数
6 使用方法
以上是关于java代码调用C代码 JNI的主要内容,如果未能解决你的问题,请参考以下文章