关于jni的问题

Joyyu 2004-09-23 05:28:23
碰到一问题:
我的java程序里是访问数据库的静态方法,java程序调试已经通过了,测试数据也正确
在c程序中调用java程序时,使用的是GetStaticMethodID调用的:

java部分代码:
class.forname("oracle.lite.poljdbc.POLJDBCDriver");//这一句已经过了
System.out.println("test ---------1");
conn=DriverManager.getConnection("jdbc:polite:polite","system","manager");//这句就过不了
System.out.println("test ---------2");

jni打印如下:
test ---------1
[Dynamic-linking native method java.sql.DriverManager.getCallerClassLoader ... JNI]
[Dynamic-linking native method java.lang.Throwable.fillInStackTrace ... JNI]
....//后面就是我其他的返回了


不知道哪位大侠能够帮我解决一下问题,非常感谢!!
...全文
188 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
Yujlyjl 2004-11-29
  • 打赏
  • 举报
回复
我也不会,做个记号先,学习中
Joyyu 2004-09-24
  • 打赏
  • 举报
回复
有人帮忙解决么?今天试过了,还是不行
HITZXL 2004-09-23
  • 打赏
  • 举报
回复
帮你顶了
Joyyu 2004-09-23
  • 打赏
  • 举报
回复
结果:
。。。。。
[Dynamic-linking native method java.security.AccessController.doPrivileged ... J
NI]
[Dynamic-linking native method java.io.WinNTFileSystem.list ... JNI]
Checked JNI functions are being used to validate JNI usage
Checked JNI functions are being used to validate JNI usage
[Dynamic-linking native method java.lang.ClassLoader.findLoadedClass ... JNI]
[Dynamic-linking native method java.lang.ClassLoader.findBootstrapClass ... JNI]
[Dynamic-linking native method java.io.FileOutputStream.writeBytes ... JNI]
TestDB.delete
Result of delete: 11
insert = 10771432
TestDB.insert
test 1
[Dynamic-linking native method java.sql.DriverManager.getCallerClassLoader ... J
NI]
[Dynamic-linking native method java.lang.Throwable.fillInStackTrace ... JNI]
Result of insert: 0
Checked JNI functions are being used to validate JNI usage

Joyyu 2004-09-23
  • 打赏
  • 举报
回复
java代码:
import java.sql.*;
import oracle.lite.poljdbc.POLJDBCDriver;
/**
* <p>Title: </p>
* <p>Description: </p>
* <p>Copyright: Copyright (c) 2004</p>
* <p>Company: </p>
* @author tann
* @version 1.0
*/

public class TestDB {
public TestDB() {
}
public static int insert(int i){
try {
System.out.println("TestDB.insert");
Class.forName("oracle.lite.poljdbc.POLJDBCDriver").newInstance();
System.out.println("test 1");
Connection conn = DriverManager.getConnection("jdbc:polite:polite",
"system", "manager");
System.out.println("test 2");
Statement stmt = conn.createStatement();
System.out.println("test 3");
ResultSet rs = stmt.executeQuery("select user_name from user_info where
user_id = 1");
while(rs.next()){
System.out.println("rs.next = "+rs.getString(1));
}
System.out.println("insert )))))))))))");
return 1;
}
catch (Exception ex) {
System.out.println("insert excepion");
ex.printStackTrace();
System.out.println("Exception : "+ex.getMessage());
return -1;
}
}
public static void main(String[] args){
try{
TestDB db = new TestDB();
db.insert(1);
}catch(Exception e){
System.out.println("ex : "+e.getMessage());
}
}
}
Joyyu 2004-09-23
  • 打赏
  • 举报
回复
c代码:
#include "jni.h"

#ifdef _WIN32
#define PATH_SEPARATOR ';'
#else
#define PATH_SEPARATOR ':'
#endif

int main()
{
JavaVMOption options[5];
JNIEnv *env;
JavaVM *jvm;
JavaVMInitArgs vm_args;
long status;
jclass cls;
jmethodID mid;
jint square;
jint back;
jboolean not;

options[0].optionString = "-Djava.class.path=.";
options[1].optionString = "-Djava.library.path=OLITE40.JAR";
options[2].optionString = "-verbose:jni";
options[3].optionString = "-Xcheck:jni";
options[4].optionString =
"-Xbootclasspath:F:\\OraHome1\\Mobile\\classes\\OLITE40.JAR;C:\\JBuilder9\\jdk1.4\\jre\\lib\\rt.jar";
memset(&vm_args, 0, sizeof(vm_args));
vm_args.version = JNI_VERSION_1_4;
vm_args.nOptions = sizeof(options)/sizeof(options[0]);
vm_args.options = options;
vm_args.ignoreUnrecognized = JNI_TRUE;

status = JNI_CreateJavaVM(&jvm, (void**)&env, &vm_args);

cls = (*env)->FindClass(env, "TestDB");
if(cls !=0)
{
mid = (*env)->GetStaticMethodID(env, cls, "delete", "(I)I");
printf("delete = %d\n",mid);
if(mid !=0)
{
not = (*env)->CallStaticBooleanMethod(env, cls, mid, 1);
printf("Result of delete: %d\n", not);
}


mid = (*env)->GetStaticMethodID(env, cls, "insert", "(I)I");
printf("insert = %d\n",mid);
if(mid !=0)
{
square = (*env)->CallStaticIntMethod(env, cls, mid, 5);
printf("Result of insert: %d\n", square);
}
}

(*jvm)->DestroyJavaVM(jvm);
return 0;
}
else{
printf("fail: %d\n", not);
return -1;
}
}

nwpulipeng 2004-09-23
  • 打赏
  • 举报
回复
???看不出来
kingfish 2004-09-23
  • 打赏
  • 举报
回复
错误不够明确


调static函数应该没问题
java:
private static void test(){

}
c:
jclass cls = env->GetObjectClass(obj);
jmethodID mid = env->GetStaticMethodID(cls,"test","()V");
env->CallStaticVoidMethod(cls,mid);

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧