Java 调用 C代码
1、编写接口
package com.lwb.testndk;
public class JNI {
static {
// 静态初始化代码块,这里加载的库名称要和 gradle 中定义的 moduleName 名称一致
System.loadLibrary("LwbLib");
}
public static native int add(int var1,int var2);
public static native String syHello(String var1);
public static native int[] increaseArayEles(int[] var1);
public static native int checkPwd(String var1);
}
2、命令行 javah com.lwb.testndk.JNI 产生头文件com_lwb_testndk_JNI.h
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* 要使用Log则需要引用 android/log.h 这个头文件 */
#include <android/log.h>
/* 可以根据需要调用不同类型的 LOG */
#ifndef LOG_TAG
#define LOG_TAG "ANDROID_LOG"
#define LOG_E(...) __android_log_print(ANDROID_LOG_ERROR, LOG_TAG , __VA_ARGS__)
#define LOG_I(...) __android_log_print(ANDROID_LOG_INFO, LOG_TAG , __VA_ARGS__)
#define LOG_W(...) __android_log_print(ANDROID_LOG_WARN, LOG_TAG , __VA_ARGS__)
#define LOG_D(...) __android_log_print(ANDROID_LOG_DEBUG, LOG_TAG , __VA_ARGS__)
#endif
/* Header for class com_lwb_testndk_JNI */
#ifndef _Included_com_lwb_testndk_JNI
#define _Included_com_lwb_testndk_JNI
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: com_lwb_testndk_JNI
* Method: add
* Signature: (II)I
*/
JNIEXPORT jint JNICALL Java_com_lwb_testndk_JNI_add
(JNIEnv *, jobject, jint, jint);
/*
* Class: com_lwb_testndk_JNI
* Method: syHello
* Signature: (Ljava/lang/String;)Ljava/lang/String;
*/
JNIEXPORT jstring JNICALL Java_com_lwb_testndk_JNI_syHello
(JNIEnv *, jobject, jstring);
/*
* Class: com_lwb_testndk_JNI
* Method: increaseArayEles
* Signature: ([I)[I
*/
JNIEXPORT jintArray JNICALL Java_com_lwb_testndk_JNI_increaseArayEles
(JNIEnv *, jobject, jintArray);
/*
* Class: com_lwb_testndk_JNI
* Method: checkPwd
* Signature: (Ljava/lang/String;)I
*/
JNIEXPORT jint JNICALL Java_com_lwb_testndk_JNI_checkPwd
(JNIEnv *, jobject, jstring);
#ifdef __cplusplus
}
#endif
#endif
3、编写C文件
#include "com_lwb_testndk_JNI.h"
/**
利用Java的String类来完成字符编码转换
*/
char* _Jstring2CStr(JNIEnv *env,jstring jstr) {
char *rtn = NULL;
jclass clsstring = (*env)->FindClass(env, "java/lang/String");
jstring strencode = (*env)->NewStringUTF(env, "GB2312");//转换成Cstring的GB2312,兼容ISO8859-1
jmethodID mid = (*env)->GetMethodID(env, clsstring, "getBytes", "(Ljava/lang/String;)[B");
jbyteArray barr = (jbyteArray) (*env)->CallObjectMethod(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);
memcpy(rtn, ba, alen);
rtn[alen] = 0; //"\0"
}
(*env)->ReleaseByteArrayElements(env, barr, ba, 0);
return rtn;
};
/*
* Class: com_lwb_testndk_JNI
* Method: add
* Signature: (II)I
*/
JNIEXPORT jint JNICALL Java_com_lwb_testndk_JNI_add
(JNIEnv *env, jobject jobject, jint ji, jint jj) {
int result = ji + jj;
return result;
};
/*
*
*/
JNIEXPORT jstring JNICALL Java_com_lwb_testndk_JNI_syHello
(JNIEnv *env, jobject jobject, jstring jstr) {
LOG_I ("log 类型 _I 000000 ");
// char* fromJava = _Jstring2CStr(env, jstr);
//c:
char* fromJava = (char *) malloc(100 );
fromJava = " I am fromJava";
char* fromc = "add I am from c";
// strcat(fromJava, fromc);//把拼接的结果放在第一个参数
LOG_I ("log 类型 _I 222222222222");
return (*env)->NewStringUTF(env, fromc);
};
/* 每个数加10
* Class: com_lwb_testndk_JNI
* Method: increaseArayEles
* Signature: ([I)[I
*/
JNIEXPORT jintArray JNICALL Java_com_lwb_testndk_JNI_increaseArayEles
(JNIEnv *env, jobject jobject, jintArray jintArray){
//数组的长度
int len = (*env)->GetArrayLength(env,jintArray);
LOG_I ("len = %d " ,len);
int i ;
jint* var = (*env)->GetIntArrayElements(env,jintArray,JNI_FALSE);
for(int i=0;i<len;i++){
*(var + i) = *(var + i) + 10;
LOG_I ("var = %d " , *(var + i));
}
return jintArray;
};
JNIEXPORT jint JNICALL Java_com_lwb_testndk_JNI_checkPwd
(JNIEnv * env, jobject jobj, jstring jstr){
char* orgin = "123456";
char* fromUser = "1234567";
// char* fromUser = _Jstring2CStr(env, jstr);
int code = strcmp(orgin,fromUser);
if(code ==0 ){
return 200;
}else{
return 400;
}
};
4、测试
public class MainActivity extends AppCompatActivity {
private static final String TAG = "MainActivity";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
TextView textView = (TextView) findViewById(R.id.text);
// textView.setText(GetString.getNativeStr());
textView.setText(new GetString().getNativeStr());
// TextView textView2 =(TextView)findViewById(R.id.text2);
// textView2.setText(GetString2.getNativeStr2());
}
public void add(View view) {
int result = JNI.add(55, 66);
Log.i(TAG, "add: result = " + result);
}
public void syHello(View view) {
String result = JNI.syHello("from java");
Log.i(TAG, "syHello: result = " + result);
}
public void increaseArayEles(View view) {
int[] var1 = new int[10];
for (int i = 0; i < var1.length; i++) {
var1[i] = i;
}
int[] result = JNI.increaseArayEles(var1);
for (int i = 0; i < result.length; i++) {
Log.i(TAG, "syHello: result = " + result[i]);
}
}
public void checkPwd(View view) {
int result = JNI.checkPwd("123456");
Log.i(TAG, "syHello: result = " + result);
}
}