【原创】Java JNI 参数

来源:互联网 发布:js requestanimframe 编辑:程序博客网 时间:2024/06/05 00:19

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

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

a. 无参数 HelloJNI.Java

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   }}

a. 无参数 HelloJNI.c

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

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

再看一个有参数的

b. 有参数 HelloJNI.java

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));   }}

b. 有参数 HelloJNI.c

#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;}

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

参考: JavaProgramming Tutorial

0 0
原创粉丝点击