从今天开始,为了好玩,希望做一个有趣android平台上的APP,但是以前没有类似的开发经验,一切从头开始,所以在过程中遇到的一些问题,能够在这里进行记录:
问题一: 由于用到jni,但是无法通过javah命令生成h头文件,比如我的HelloWord.class的目录结构是
E:\gayShe\,我在这个目录下执行E:\gayShe\jni>javah -jni jni.HelloWorld 这个命令,报如下错误:
错误:无法访问 jni.HelloWorld
未找到 jni.HelloWorld 的类文件
javadoc: 错误 - 找不到类 jni.HelloWorld。
Error: 未在命令行中指定任何类。请尝试使用 -help。
网上搜索了一下,发现是路径不对的原因,由于我的 HelloWorld是的包路径是jni.HelloWorld,因此如果我想要生成这个h头文件,就需要手动生成一个jni目录,把class文件的目 录结构改成E:\gayShe\jni,然后在E:\gayShe\目录下执行javah -classpath . -jni jni.HelloWorld 这个命令(这里注意,-classpath和-jni之间有一个点号),那么jni_HelloWorld.h这个头文件就生成在E:\gayShe\目录下了。
问题二: 需要通过C编译器生成DLL(Windows系统)或者SO(Linux系统)文件,我这次是生成了DLL文件,下载一个VC6++,然后选择新建工程,注意,这里需要选择“Win32 Dynamic-link Libray”
这个工程,然后写好代码,完成编译,生成dll文件(在这个工程的debug目录下),然后再把这个dll文件拷贝到java工程目录下,比如我的工程路径是D:\work\testExamples,那么我这边只需要把dll文件放到D:\work\testExamples这个目录下就行了。注意,前面的路径只是在我用单元测试的时候是有效的,而当我在用jboss去加载这个dll的时候,目前我只发现有两个方法可以确保找到dll,一个是把dll放到C:\Windows\System32路径下,另一个就是设置path变量,不知道有没有第三种方法。
jni的相关概念:JNI是java的一部分,通过此,可以实现跨平台,与其他语言进行交互,具体可参考网上的这篇文档:
原网址:http://www.cnblogs.com/mandroid/archive/2011/06/15/2081093.html
JAVA基础之理解JNI原理
*
*/
package com.magc.jni;
/**
* @author magc
*
*/
public class HelloWorld {
static {
System.loadLibrary("Hello");
}
public native void DisplayHello();
/**
* @param args
*/
public static void main(String[] args) {
new HelloWorld().DisplayHello();
#include <jni.h>
/* Header for class com_magc_jni_HelloWorld */
#ifndef _Included_com_magc_jni_HelloWorld
#define _Included_com_magc_jni_HelloWorld
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: com_magc_jni_HelloWorld
* Method: DisplayHello
* Signature: ()V
*/
JNIEXPORT void JNICALL Java_com_magc_jni_HelloWorld_DisplayHello
(JNIEnv *, jobject);
#ifdef __cplusplus
}
#endif
#endif
#include "com_magc_jni_HelloWorld.h"
#include <stdio.h>
JNIEXPORT void JNICALL Java_com_magc_jni_HelloWorld_DisplayHello
(JNIEnv *env, jobject obj)
{
printf("From jni_helloworldImpl.cpp :");
printf("Hello world ! \n");
return;
}