版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/shallcheek/article/details/45912761
Java调用JJNI相信大家都会了,昨天写一个jni调用java真是被坑惨了,就不详细描述了 在此记录一下
调用步骤
1:申明引用函数Class函数
例如:
char* classname = "com/android/cofig/XXX"; //跟java的区别是.换成/
jclass clazz = (*env)->FindClass(env, classname);// 找到java的 class文件
2:寻找class里面的方法就是JAVA的方法函数 得到一个实例的域的ID
例如:
方法名 | 作用 |
---|---|
GetFieldID | 得到一个实例的域的ID |
GetStaticFieldID | 得到一个静态的域的ID |
GetMethodID | 得到一个实例的方法的ID |
GetStaticMethodID | 得到一个静态方法的ID |
调用注意区分
jmethodID method = (*env)->GetMethodID(env, clazz, "test",
"(Ljava/lang/String;)Ljava/lang/String;");
//clazz函数 test函数名 (Ljava/lang/String;)Ljava/lang/String; 这一句是定义参数借口的传递值和返回值这个方法名就是这样
public String test(String test)
{
}
//定义方法的对照表网上找的一份
类型 | 符号 |
---|---|
boolean | Z |
byte | B |
char | C |
short | S |
int | I |
long | L |
float | F |
double | D |
void | V |
object对象 | LClassName; L类名;//这个理解成String转换就成这样 Ljava/lang/String; |
Arrays | [array-type [数组类型 |
3:函数调用
例如:
//clazz为第一步定义的clazz method方法定义的id
jstring result = (jstring)(*env)->CallObjectMethod(env, clazz, method,
action);
// 使用CallObjectMethod方法调用方法。参数的意义:
/**env-->JNIEnv
//obj-->第一步定义的class
//mid--> 即第二步获得的Methodid
//action-->方法需要的参数
**/
当然CallMethod的方法很多 例调用类似
CallVoidMethod CallStaticVoidMethod
CallIntMethod CallStaticVoidMethod
CallBooleanMethod CallStaticVoidMethod
CallByteMethod CallStaticVoidMethod
推荐一个网址查看Android jni的很多函数
http://game.ceeger.com/Script/AndroidJNI/AndroidJNI.html