您的位置:首页 > 编程语言 > Java开发

【原创】Java JNI 参数

2017-03-20 14:49 344 查看


反编译一个 APP 时候, 一个.so通过 loadLibrary加载. 把. so 逆向后, 函数名已经混淆,
但无法根据参数信息获取究竟哪一个才是对外提供的接口.

所以了解一下 JNI,
so文件中代码如何编码, 参数如何定义


a. 无参数 HelloJNI.Java

[code]public class HelloJNI {
static {
System.loadLibrary("hello"); // hello.dll (Windows) or libhello.so (Unixes)
}

// Declare native method
private native void sayHello();

// Test Driver
public static void main(String[] args) {
new HelloJNI().sayHello();  // invoke the native method
}
}

[/code]


a. 无参数 HelloJNI.c

[code]#include
#include
#include "HelloJNI.h"

JNIEXPORT void HelloJNI  {
printf("Hello World!\n");
return;
}

[/code]


可以看到, java无参数调用接口时, *.c中定义的接口是有两个默认参数的. 一个 JNIEnv 一个 jobject.
JNIEnv可以理解为 JNI 虚拟环境相关对象, jobject thisObj 看意思应该是类本身, 类似 java 中的
this 或者 python 中的 self


再看一个有参数的


b. 有参数 HelloJNI.java

[code]public class HelloJNI {
static {
System.loadLibrary("myjni"); // myjni.dll (Windows) or libmyjni.so (Unixes)
}

// Declare a native method average() that receives two ints and return a double containing the average
private native double average(int n1, int n2);

// Test Driver
public static void main(String args[]) {
System.out.println("In Java, the average is " + new TestJNIPrimitive().average(3, 2));
}
}

[/code]


b. 有参数 HelloJNI.c

[code]#include
#include
#include "HelloJNI.h"

JNIEXPORT jdouble JNICALL Java_TestJNIPrimitive_average
(JNIEnv *env, jobject thisObj, jint n1, jint n2) {
jdouble result;
printf("In C, the numbers are %d and %d\n", n1, n2);
result = ((jdouble)n1 + n2) / 2.0;
// jint is mapped to int, jdouble is mapped to double
return result;
}

[/code]


可以确认, 第一二个形参为默认参数, 之后的形参才是 java 调用时的实参.

参考: Java
Programming Tutorial

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: