package CJava;
public class NativeClass {
public native int nativeAdd(int a,int b);
public static void main(String[] args) {
System.loadLibrary("CJAVA");//注意CJAVA 就是我们建立的动态库
NativeClass a=new NativeClass();
int v=a.nativeAdd(10,20);
System.out.println(v1);
}
}
根据自己的环境选择 不同的SDK 但是需要记住保持一致
tips:Windows 确定Java 路径命令 where java
1 第一个是 刚才实现的
2 第二个是通过java 虚拟机实现
刚才的Java 虚拟机实现函数如下
JNIEXPORT jdouble JNICALL nativefAdd
(JNIEnv*, jobject, jdouble a, jdouble b)
{
printf("%s(%d):%s a=%f b=%f\r\n", __FILE__, __LINE__, __FUNCTION__, a, b);
return a + b;
}
JNIEXPORT jint JNICALL
JNI_OnLoad(JavaVM* vm, void* reserved)
{
jint result = -1;
JNIEnv* env = NULL;
if (vm->GetEnv((void**)&env, JNI_VERSION_10) != JNI_OK) //底层 虚拟机
{
printf("%s(%d):%s\r\n", __FILE__, __LINE__, __FUNCTION__);
return -1;
}
jclass clz = env->FindClass("CJava/NativeClass");//正规是.
if (clz == NULL)
{
printf("%s(%d):%s\r\n", __FILE__, __LINE__, __FUNCTION__);
return -1;
}
// double doubel doubel
JNINativeMethod methods[] = {
{(char*)"nativefAdd",(char*)"(DD)D",(void*)&nativefAdd}
};
result = env->RegisterNatives(clz, methods, sizeof(methods) / sizeof(JNINativeMethod)); //有危险 监控一个java 程序 先使用自己的 调用原来的java 也可以防御 java 可以被逆向 但是具体逻辑是看这里
if (result != 0)
{
printf("%s(%d):%s\r\n", __FILE__, __LINE__, __FUNCTION__);
return -1;
}
return JNI_VERSION_10;
}