java JNI调用动态库 获取硬件信息 制作软件加密 (二)

2014-11-24 11:39:19 · 作者: · 浏览: 13
>NewStringUTF("utf-8");
return (jstring)env->NewObject(strClass, ctorID, bytes, encoding);
}
//数据类型转换
JNIEXPORT jstring JNICALL Java_JNI_getCPUID_getcpuID
(JNIEnv * env, jclass js)
{
char cpuid[40];
getCPUID(cpuid);
return stoJstring(env,cpuid);
} 12、修改JNI_getCPUID.h 文件的 把<>改为“” 否则 会包找不到头文件错误。

13、编译项目把生成的 getCPUID.dll 拷贝到任何一个换件变量path 路劲下就可以 我这拷贝到

C:\Program Files\Java\jdk1.5.0_06\bin 文件夹下

14、做个一个是测试的jsp页面 或者 在上面的java文件的类后面 加一个 main方法进行测试 加完mian如下

[java]
package JNI;


public class getCPUID {
//定义一个方法 该方法是在dll中实现
public native static String getcpuID();
static
{
System.loadLibrary( "getCPUID" ); //加载dll库
}

public static void main(String[] args) {
//yysLic u=new yysLic();
@SuppressWarnings("unused")
String ls_cpuID=getCPUID.getcpuID();


}
}

package JNI;


public class getCPUID {
//定义一个方法 该方法是在dll中实现
public native static String getcpuID();
static
{
System.loadLibrary( "getCPUID" ); //加载dll库
}

public static void main(String[] args) {
//yysLic u=new yysLic();
@SuppressWarnings("unused")
String ls_cpuID=getCPUID.getcpuID();


}
}
调试 查看 ls_cpuID 变量的值

15、在写jni代码是常用的 java与c++类型转换的 方法(注 int 不需要手动转能自动转换)

//char * 转java的jstring

[cpp]
jstring stoJstring(JNIEnv* env, char* pat)
{
jclass strClass = env->FindClass("Ljava/lang/String;");
jmethodID ctorID = env->GetMethodID(strClass, "", "([BLjava/lang/String;)V");
jbyteArray bytes = env->NewByteArray(strlen(pat));
env->SetByteArrayRegion(bytes, 0, strlen(pat), (jbyte*)pat);
jstring encoding = env->NewStringUTF("utf-8");
return (jstring)env->NewObject(strClass, ctorID, bytes, encoding);
}
//

jstring stoJstring(JNIEnv* env, char* pat)
{
jclass strClass = env->FindClass("Ljava/lang/String;");
jmethodID ctorID = env->GetMethodID(strClass, "", "([BLjava/lang/String;)V");
jbyteArray bytes = env->NewByteArray(strlen(pat));
env->SetByteArrayRegion(bytes, 0, strlen(pat), (jbyte*)pat);
jstring encoding = env->NewStringUTF("utf-8");
return (jstring)env->NewObject(strClass, ctorID, bytes, encoding);
}
//
//jstring 转 char*

[cpp]
//jstring to char*
char* jstringTostring(JNIEnv* env, jstring jstr)
{
char* rtn = NULL;
jclass clsstring = env->FindClass("java/lang/String");
jstring strencode = env->NewStringUTF("utf-8");
jmethodID mid = env->GetMethodID(clsstring, "getBytes", "(Ljava/lang/String;)[B");
jbyteArray barr= (jbyteArray)env->CallObjectMethod(jstr, mid, strencode);
jsize alen = env->GetArrayLength(barr);
jbyte* ba = env->GetByteArrayElements(barr, JNI_FALSE);
if (alen > 0)
{
rtn = (char*)malloc(alen + 1);
memcpy(rtn, ba, alen);
rtn[alen] = 0;
}
env->ReleaseByteArrayElements(barr, ba, 0);
return rtn;
}

//jstring to char*
char* jstringTostring(JNIEnv* env, jstring jstr)
{
char* rtn = NULL;
jclass clsstring = env->FindClass("java/lang/String");
jstring strencode = env->NewStringUTF("utf-8");
jmethodID mid = env->GetMethodID(clsstring, "getBytes", "(Ljava/lang/String;)[B");
jbyteArray barr= (jbyteArray)en