【原创】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 调用时的实参.
参考: JavaProgramming Tutorial
相关文章推荐
- java 可变参数的应用
- 【原创】java web strut…
- jni java String 转C char*工具类
- 【原创】java web Actio…
- 【原创】Java HttpClient&nbs…
- java中传参数时,在类型后面跟"..."的使用
- JNI实现回调| JNI调用JAVA函数|参数和返回值的格式
- 【原创】Java中native2ascii工具命令参数
- Java可变长参数(原创)
- delphi&Java&JNI一次体验
- 关于"Java中方法参数的传递方式"的探讨
- JNI学习2 C和Java参数传递
- Java applet & native method (JNI) -- Snippets
- [原创]Android 基于NDK的JNI开发 C调用java和java调用C的进阶教程
- Android JNI入门第二篇——Java参数类型与本地参数类型对照
- Android JNI入门第二篇——Java参数类型与本地参数类型对照
- Jni中C++和Java的参数传递
- java的PreparedStatement.setString(1, "");后一个参数不能为空,否则出错
- 用"堆栈区数据复制"理解Java赋值和参数传递机制的心得
- JNI之一:基础 && JAVA调用win dll实例