1:JAVA调用c
public native int callC(String str,float f ,int i,long l,int[]arr);
.c中
#include <jni.h>
#include <string.h>
//打印
#include <android/log.h>
#define LOG_TAG "System.out"
//带参 宏定义
#define LOGD(...) __android_log_print(ANDROID_LOG_DEBUG, LOG_TAG, __VA_ARGS__)
#define LOGI(...) __android_log_print(ANDROID_LOG_INFO, LOG_TAG, __VA_ARGS__)
/**
* JAVA的string 转 c的str 工具
*/
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;
}
/**
* jni 工程师 编写
*/
JNIEXPORT jint JNICALL Java_com_example_jnitest_MainActivity_callC(JNIEnv *env,
jobject obj, jstring str, jfloat f, jint i, jlong l, jintArray jarray) {
//string 转 c
char *cStr = Jstring2CStr(env, str);
//c 转string
jstring s = (*env)->NewStringUTF(env, cStr);
//String长度
int length = (*env)->GetStringLegth(env, str);
//java int 数组长度
int size = (*env)->GetArrayLength(env, jarray);
//数组首地址
int* cIntArray = (*env)->GetIntArrayElements(env, jarray, 0);
int var;
for (var = 0; var < size; ++var) {
*(cIntArray + i) += 10; //修改数组,传址!
}
//jfloat jint 和c一样
//jlong 一样long long
int result = cFuncation(cStr, f, i, l);
return result;
}
/**
*c代码 c工程师编写
*/
int cFuncation(char* str, float f, int i, long long l) {
//printf(""); 使用不了
LOGD("AAAA"); //打印}
//业务逻辑...
return 0 :
}
添加library -l library
LOCAL_LDLIBS+= -llog //打印库
2:c调用java
反射:
//得到类的字节码
Class clazz = Test.class.getClassLoader().loadClass("Student");
//解析字节码 获取一个方法
Method method = clazz.getMethod("methodName", String.class);
//调用
method.invoke(clazz.newInstance(), "paramString");
javap 获取参数类型
cd到 bin/classes 下
D:\adt-bundle\workspace\JNITest\bin\classes>javap -s com.example.jnitest.MainActivity
public void click2(java.lang.String);
descriptor: (Ljava/lang/String;)V
/**
*调用java void 参数 String的方法
*/
int cFuncation(JNIEnv *env, jobject obj, char* msg)
{
//得到类的字节码
jclass clazz = (*env)->FindClass(env, "com/example/jnitest/MainActivity");
if (clazz == 0) {
LOGD("can't find class");
} else {
LOGD("find success");
}
//解析字节码 获取一个方法
jmethodID jmethod = (*env)->GetMethodID(env, clazz, "methodName",
"(Ljava/lang/String;)V"); //V void I int :return void ,参数 String
if (jmethod == 0) {
LOGD("can't find method");
} else {
LOGD("find method success");
}
//调用<span style="font-family: Arial, Helvetica, sans-serif;">CallVoidMethod </span>(JNIEnv*, jobject, jmethodID, ...);
(*env)->CallVoidMethod(env, obj, jmethod, (*env)->NewStringUTF(env, msg));
return 0;
}
3. c调用静态的java方法
public static void methodName()
{
System.out.println("java method!");
}
/**
*调用java void 参数 void 的 静态方法
*/
int cFuncation(JNIEnv *env, jobject obj, char* msg)
{
//得到类的字节码
jclass clazz = (*env)->FindClass(env, "com/example/jnitest/MainActivity");
//解析字节码 获取一个方法
jmethodID jmethod = (*env)->GetStaticMethodID(env, clazz, "methodName", "()V"); //V void
//调用(JNIEnv*, jobject, jmethodID, ...);
(*env)->CallStaticVoidMethod(env, clazz, jmethod);
return 0;
}