免费注册 查看新帖 |

ChinaUnix.net

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1484 | 回复: 2

JavaNative 使用C多线程库的问题 [复制链接]

论坛徽章:
19
CU大牛徽章
日期:2013-03-13 15:32:35CU大牛徽章
日期:2013-09-18 15:15:15CU大牛徽章
日期:2013-05-20 10:46:44CU大牛徽章
日期:2013-05-20 10:46:38CU大牛徽章
日期:2013-05-20 10:46:31CU大牛徽章
日期:2013-05-20 10:46:25CU大牛徽章
日期:2013-05-20 10:46:18CU大牛徽章
日期:2013-04-17 11:19:51CU大牛徽章
日期:2013-04-17 11:19:42CU大牛徽章
日期:2013-04-17 11:19:37CU大牛徽章
日期:2013-04-17 11:19:32CU大牛徽章
日期:2013-04-17 11:19:28
发表于 2013-07-19 11:37 |显示全部楼层
Java类文件
  1. package com.fangzhaoguo.primefinder;

  2. public class NativeConcurrentPrimeFinder {

  3.         static {
  4.                 System.loadLibrary("libJavaNative_ConcurrentPrimeFinder");
  5.         }

  6.         public NativeConcurrentPrimeFinder() {
  7.         }

  8.         public native boolean isPrime(final long number);

  9.         public native int countPrime(final long number);

  10.         public native int countPrime(final long lower, final long upper);
  11. }
复制代码
javah后的C头文件,并且经过我的修改,加入了自定义的变量、数据结构以及函数
  1. /* DO NOT EDIT THIS FILE - it is machine generated */
  2. #include "jni.h"
  3. #include <pthread.h>
  4. #include <stdio.h>
  5. #include <malloc.h>
  6. #include <math.h>
  7. /* Header for class com_fangzhaoguo_primefinder_NativeConcurrentPrimeFinder */
  8. jint total = 0;

  9. typedef struct {
  10.         JNIEnv *env;
  11.         jobject obj;
  12.         jlong lower;
  13.         jlong upper;
  14. } Message;

  15. #ifndef _Included_com_fangzhaoguo_primefinder_NativeConcurrentPrimeFinder
  16. #define _Included_com_fangzhaoguo_primefinder_NativeConcurrentPrimeFinder
  17. #ifdef __cplusplus
  18. extern "C" {
  19. #endif
  20.         /*
  21.          * Class:     com_fangzhaoguo_primefinder_NativeConcurrentPrimeFinder
  22.          * Method:    isPrime
  23.          * Signature: (J)Z
  24.          */
  25.         JNIEXPORT jboolean JNICALL Java_com_fangzhaoguo_primefinder_NativeConcurrentPrimeFinder_isPrime(
  26.                         JNIEnv *, jobject, jlong);

  27.         /*
  28.          * Class:     com_fangzhaoguo_primefinder_NativeConcurrentPrimeFinder
  29.          * Method:    countPrime
  30.          * Signature: (J)I
  31.          */
  32.         JNIEXPORT jint JNICALL Java_com_fangzhaoguo_primefinder_NativeConcurrentPrimeFinder_countPrime__J(
  33.                         JNIEnv *, jobject, jlong);

  34.         /*
  35.          * Class:     com_fangzhaoguo_primefinder_NativeConcurrentPrimeFinder
  36.          * Method:    countPrime
  37.          * Signature: (JJ)I
  38.          */
  39.         JNIEXPORT jint JNICALL Java_com_fangzhaoguo_primefinder_NativeConcurrentPrimeFinder_countPrime__JJ(
  40.                         JNIEnv *, jobject, jlong, jlong);

  41.         void *countPrimeInRange(void* mess);

  42. #ifdef __cplusplus
  43. }
  44. #endif
  45. #endif
复制代码
Mingw编译的C文件 ,使用了pthread头文件,并且在链接时使用了pthread,编译正常
线程调用时通过message来传递JavaNative特有的参数
  1. /*
  2. * com_fangzhaoguo_primefinder_NativeConcurrentPrimeFinder.c
  3. *
  4. *  Created on: 2013年7月18日
  5. *      Author: root
  6. */

  7. #include "com_fangzhaoguo_primefinder_NativeConcurrentPrimeFinder.h"

  8. JNIEXPORT jboolean JNICALL Java_com_fangzhaoguo_primefinder_NativePrimeFinder_isPrime(
  9.                 JNIEnv *env, jobject obj, jlong number) {
  10.         jlong i = 0;
  11.         if (1 >= number) {
  12.                 return 0;
  13.         }
  14.         for (i = 2; i <= sqrt(number); i++) {
  15.                 if (0 == number % i) {
  16.                         return 0;
  17.                 }
  18.         }
  19.         return 1;
  20. }

  21. void *countPrimeInRange(void* mess) {
  22.         jlong i = 0;
  23.         Message* message = (Message*) mess;
  24.         for (i = message->lower; i < message->upper; i++) {
  25.                 if (Java_com_fangzhaoguo_primefinder_NativePrimeFinder_isPrime(
  26.                                 message->env, message->obj, i)) {
  27.                         total++;
  28.                 }
  29.         }
  30.         return NULL;
  31. }

  32. JNIEXPORT jint JNICALL Java_com_fangzhaoguo_primefinder_NativePrimeFinder_countPrime__J(
  33.                 JNIEnv *env, jobject obj, jlong number) {
  34.         pthread_t thread[4];
  35.         Message* message = (Message*) malloc(sizeof(Message));
  36.         message->env = env;
  37.         message->obj = obj;
  38.         jlong start = 0, end = 0;
  39.         jlong range = number / 4;
  40.         jint i = 0;
  41.         for (i = 0; i < 4; i++) {
  42.                 start = 0 + range * i;
  43.                 if (i < 3) {
  44.                         end = start + range;
  45.                 } else {
  46.                         end = number;
  47.                 }
  48.                 message->lower = start;
  49.                 message->upper = end;
  50.                 pthread_create(&thread[i], NULL, countPrimeInRange, (void*) message);
  51.         }
  52.         return total;
  53. }

  54. JNIEXPORT jint JNICALL Java_com_fangzhaoguo_primefinder_NativePrimeFinder_countPrime__JJ(
  55.                 JNIEnv *env, jobject obj, jlong lower, jlong upper) {
  56.         jlong i = 0;
  57.         for (i = lower; i < upper; i++) {
  58.                 if (Java_com_fangzhaoguo_primefinder_NativePrimeFinder_isPrime(env, obj,
  59.                                 i)) {
  60.                         total++;
  61.                 }
  62.         }
  63.         return total;
  64. }
复制代码
但是现在的问题是在java中运行时报错,不管使用C写还是加载boost类的C++写,都报相同的错误。有不使用C/C++多线程的例子,可以正常使用
以下是报错内容
  1. Exception in thread "main" java.lang.UnsatisfiedLinkError: com.fangzhaoguo.primefinder.NativeConcurrentPrimeFinder.countPrime(J)I
  2.         at com.fangzhaoguo.primefinder.NativeConcurrentPrimeFinder.countPrime(Native Method)
  3.         at com.fangzhaoguo.primefinder.Main.timeAndCompute(Main.java:58)
  4.         at com.fangzhaoguo.primefinder.Main.main(Main.java:6)
复制代码

论坛徽章:
4
双子座
日期:2014-08-28 10:08:002015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:58:112015年亚洲杯之阿联酋
日期:2015-03-13 03:25:15
发表于 2013-07-20 23:58 |显示全部楼层
看看是不是编译的原因,strings看一下你的函数名的符号有没有多个@符号,如果有的话,改一下编译参数

论坛徽章:
19
CU大牛徽章
日期:2013-03-13 15:32:35CU大牛徽章
日期:2013-09-18 15:15:15CU大牛徽章
日期:2013-05-20 10:46:44CU大牛徽章
日期:2013-05-20 10:46:38CU大牛徽章
日期:2013-05-20 10:46:31CU大牛徽章
日期:2013-05-20 10:46:25CU大牛徽章
日期:2013-05-20 10:46:18CU大牛徽章
日期:2013-04-17 11:19:51CU大牛徽章
日期:2013-04-17 11:19:42CU大牛徽章
日期:2013-04-17 11:19:37CU大牛徽章
日期:2013-04-17 11:19:32CU大牛徽章
日期:2013-04-17 11:19:28
发表于 2013-07-21 11:59 来自手机 |显示全部楼层
使用nm看吗?有下划线数量的变化,没有发现@
不过boost版的问题多些
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

ITPUB技术栈

ITPUB技术栈是ITPUB企业打造的垂直于IT领域的知识社群平台,在这里,你既可以是创作者也可以是消费者。如果你的IT生涯丰富多彩,喷薄的个人价值尽可在小栈内体现;如果你渴望找到志同道合的伙伴,拓宽人脉,小栈比跑会场更快。 小栈特色:
1.极高的用户转化率,实现更直接的知识变现;
2.随时随地,刷个朋友圈的时间,实现更长效的信息沉淀;
3.戳痛、难点的专业咨询,更接近成功解决方案的时刻;
4.贴近意见领袖,个人高速成长,迈入更富有价值的人际圈。

----------------------------------------

技术小栈>>
  

北京盛拓优讯信息技术有限公司. 版权所有 16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122
中国互联网协会会员  联系我们:huangweiwei@it168.com
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP