java调c
1.写native代码用于调用c代码,在java中写
public class JNI {
static {
System.loadLibrary("Test");
}
/*
* 定义native方法
* 调用c代码对应的方法
* */
2.编译动态链接库,什么也不配置,编译的动态链接库是以当前的module名称为库名称
lib+modulename+.so
最好是配置动态链接库的名称,在build.gradle中
defaultConfig {
applicationId "www.basketi.cn.basketball.ccalljavademo"
minSdkVersion 15
targetSdkVersion 24
versionCode 1
versionName "1.0"
ndk{
moduleName ("Test");
abiFilters "armeabi", "armeabi-v7a", "x86"
}
ndk{
ldLibs "log"
}
}
3.加载动态链接库
static {
//加载动态链接库
System.loadLibrary("Test");
}
4.写对应的c代码
java中native去调用c代码
给含有native方法的类生成头文件,如JNI类,然后根据头文件中的方法,写对应的c代码
c代码
1.写native代码用于调用c代码,在java中写
public class JNI {
static {
System.loadLibrary("Test");
}
/*
* 定义native方法
* 调用c代码对应的方法
* */
/*
* 让c代码做加法运算 把结果返回给java
*
* */
public native int add(int x,int y);
/*
* 从java传入字符串,c代码进行拼接
*
* s I am from java
* I am from java I am from c
* */
public native String sayHello(String s);
/*
* 让c代码给每个元素都加上十
* */
public native int[] increaseArrayEles(int[] intArray);
/* *
* 应用:检查密码是否正确 如果正确 返回200 否则返回400
* */
public native int checkPwd(String pwd);
}2.编译动态链接库,什么也不配置,编译的动态链接库是以当前的module名称为库名称
lib+modulename+.so
最好是配置动态链接库的名称,在build.gradle中
defaultConfig {
applicationId "www.basketi.cn.basketball.ccalljavademo"
minSdkVersion 15
targetSdkVersion 24
versionCode 1
versionName "1.0"
ndk{
moduleName ("Test");
abiFilters "armeabi", "armeabi-v7a", "x86"
}
ndk{
ldLibs "log"
}
}
3.加载动态链接库
static {
//加载动态链接库
System.loadLibrary("Test");
}
4.写对应的c代码
java中native去调用c代码
给含有native方法的类生成头文件,如JNI类,然后根据头文件中的方法,写对应的c代码
c代码
/* DO NOT EDIT THIS FILE - it is machine generated */
#include "www_basketi_cn_basketball_javacallcdemo_JNI.h"
#include<jni.h>
#include<stdio.h>
#include <stdlib.h>
#include<string.h>
char* _jstringToChar(JNIEnv* env, jstring jstr)
{
char* rtn = NULL;
jclass clsstring = (*env)->FindClass(env,"java/lang/String");
jstring strencode = (*env)->NewStringUTF(env,"UTF-8");
jmethodID mid = (*env)->GetMethodID(env,clsstring, "getBytes", "(Ljava/lang/String;)[B");
jbyteArray barr= (jbyteArray)(*env)->CallObjectMethod(env,jstr,mid,strencode);
jsize alen = (*env)->GetArrayLength(env,barr);
jbyte * ba = (*env)->GetByteArrayElements(env,barr,JNI_FALSE);
if(alen > 0)
{
rtn = (char*)malloc(alen+1); //new char[alen+1];
memcpy(rtn,ba,alen);
rtn[alen]=0;
}
(*env)->ReleaseByteArrayElements(env,barr,ba,0);
return rtn;
}
/*
jint 返回值
Java_www_basketi_cn_basketball_javacallcdemo_JNI 全类名_方法名
*/
jint Java_www_basketi_cn_basketball_javacallcdemo_JNI_add
(JNIEnv *evn, jobject jobject, jint ji, jint jj){
int result=ji+jj;
return result;
};
jstring Java_www_basketi_cn_basketball_javacallcdemo_JNI_sayHello
(JNIEnv * env, jobject jt, jstring js){
//c: 将jstring 转换为char类型
char* fromJava=_jstringToChar(env,js);
char* fromC="add I am from C";
//拼接函数
strcat(fromJava,fromC);//把拼接的结果放在第一个参数里面
//将char类型转换成jstring
return (*env)->NewStringUTF(env,fromJava);
//return "";
};
/**
*给每个元素加上十
*/
jintArray Java_www_basketi_cn_basketball_javacallcdemo_JNI_increaseArrayEles
(JNIEnv * env, jobject jb, jintArray jintArray){
//1 得到数组长度
jsize size=(*env)->GetArrayLength(env,jintArray);
//2.得到数组元素
jint* ja=(*env)->GetIntArrayElements(env,jintArray,JNI_FALSE);
//3.遍历数组 给每个元素加上10
int i;
for(i=0;i<size;i++){
*(ja+i)+=10;
}
//4 返回结果
return jintArray;
};
JNIEXPORT jint JNICALL Java_www_basketi_cn_basketball_javacallcdemo_JNI_checkPwd
(JNIEnv *env, jobject jobject, jstring jstring){
//假设服务器的密码123456
char* origin="123456";
char* user=_jstringToChar(env,jstring);
//函数 比较字符串是否相同
int code =strcmp(origin,user);
if(code==0){
return 200;
}else{
return 400;
}
};
5.执行java调用c的代码jni=new JNI();
((Button) findViewById(R.id.jcc)).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
jni.add(991,1);
Log.i("add---",jni.add(991,1)+"");
}
});
((Button) findViewById(R.id.jcc2)).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
String result=jni.sayHello("i am from java");
Log.i("javacllc----",result);
}
});
((Button) findViewById(R.id.jcc3)).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
int array[]={1,2,3};
int[] cArray=jni.increaseArrayEles(array);
for (int i=0;i<cArray.length;i++){
Log.i("-cArray---",cArray[i]+"");
}
}
});
((Button) findViewById(R.id.checkpwd)).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
int result=jni.checkPwd("123456");
Log.i("-检验结果result---",result+"");
}
});
源码地址:http://download.csdn.net/detail/lzq520210/9733500