GCC __attribute__((...))语法的文档表明属性必须用双括号包围,但不能给出这个设计决策的基本原理.
什么实际原因会导致GCC的设计师要求这样做?它与预处理器处理双括号有什么关系吗?
public class Shared {
public static void main(String arg[]) throws SecurityException, NoSuchMethodException, IllegalArgumentException, IllegalAccessException, InvocationTargetException {
Shared s1 = new Shared();
Object obj[] = new Object[2];
obj[0] = "object1";
obj[1] = "object2";
s1.testParam(null, obj);
Class param[] = new Class[2];
param[0] = String.class;
param[1] = Object[].class; //// how to define the second parameter as array
Method testParamMethod = s1.getClass().getDeclaredMethod("testParam", param);
testParamMethod.invoke("", obj); ///// here getting error
}
public void testParam(String query,Object ... params){
System.out.println("in the testparam method");
}
}
Run Code Online (Sandbox Code Playgroud)
这是输出:
in …Run Code Online (Sandbox Code Playgroud) 我需要将Java BigInteger实例转换为以字节为单位的值.从API中,我得到了这个方法toByteArray(),它返回一个包含这个BigInteger的二进制补码表示的byte [].
因为我的所有数字都是正128位(16字节)整数,所以我不需要2位补码形式给我128位+符号位(129位)......
有没有办法直接从BigInteger获得标准(没有2的补码形式)表示?
如果没有,我怎么能正确移位整个byte [17]数组以丢失符号位以获得一个byte [16]数组?
我已经在这里看到了这个问题,尝试了提议的修复,但到目前为止我没有成功.我有相当多的Java经验,但JNI很久以前,从来没有在Linux上做过...
我正在尝试在Linux上运行一个简单的HelloWorld JNI应用程序.
小java文件:
class HelloWorld {
private native void print();
public static void main(String[] args){
new HelloWorld().print();
}
static {
System.out.println(System.getProperty("java.library.path"));
System.loadLibrary("HelloWorld");
}
}
Run Code Online (Sandbox Code Playgroud)
小C文件:
#include <jni.h>
#include <stdio.h>
#include "HelloWorld.h"
JNIEXPORT void JNICALL
Java_HelloWorld_print(JNIEnv *env, jobject obj)
{
printf("Hello World!\n");
return;
}
Run Code Online (Sandbox Code Playgroud)
通过以下方式编译C文件:
gcc -shared -Wall -fPIC HelloWorld.c -I/usr/lib/gcc/x86_64-redhat-linux/3.4.3/include/ -o libHelloWorld.so
Run Code Online (Sandbox Code Playgroud)
运行应用程序:
java HelloWorld
Run Code Online (Sandbox Code Playgroud)
要么
java -Djava.library.path=/home/nxp40954/jnitesting/. HelloWorld
Run Code Online (Sandbox Code Playgroud)
但没有好处,得到一个:
Exception in thread "main" java.lang.UnsatisfiedLinkError: /home/nxp40954/jnitesting/libHelloWorld.so: /home/nxp40954/jnitesting/libHelloWorld.so: cannot open shared object file: No such file or directory
Run Code Online (Sandbox Code Playgroud)
奇怪,因为实际上有一个/home/nxp40954/jnitesting/libHelloWorld.so …
我正在尝试观察CDI Web应用程序的启动和关闭事件.我有一个ApplicationScoped bean来侦听这些事件:
@ApplicationScoped
public class PrettyfacesStartupObserver
{
private static final Log LOGGER = LogFactory.getLog(PrettyfacesStartupObserver.class);
public PrettyfacesStartupObserver()
{
LOGGER.debug("\n\n\n\n\n\n\n\n\n\nconstructor");
}
public void onStartup(@Observes
AfterBeanDiscovery afterBeanDiscovery
)
{
LOGGER.debug("\n\n\n\n\n\n\n\n\n\nafter bean discover");
}
public void onStartup(@Observes
AfterDeploymentValidation afterDeploymentValidation
)
{
LOGGER.debug("\n\n\n\n\n\n\n\n\n\n\nafter deployment validation");
}
public void onShutdown(@Observes
BeforeShutdown beforeShutdown
)
{
LOGGER.debug("\n\n\n\n\n\n\n\n\n\n\nbefore shutdown:" + beforeShutdown);
}
Run Code Online (Sandbox Code Playgroud)
我在日志中看不到任何内容.
我错过了什么?
据我所知,我不能从C++中调用将从Java字符串数组返回的方法,所以只有这个解决方案是循环调用方法,它将返回数组元素,但是如何将它们存储在C++数组中呢?
在Java中我有方法:
public static String getData(int index){ return arry[index]; }
Run Code Online (Sandbox Code Playgroud)
在C++中:
char * args[10];
for (int i = 0; i < arrayLength; i ++) {
jmethodID mid = env->GetStaticMethodID(INF.cls_JSox, "getData",(I)Ljava/lang/String;");
jobject result = env->CallStaticObjectMethod(cls, mid, num, i);
const char *nativeString = env->GetStringUTFChars( (jstring) result, 0);
const size_t len = strlen(nativeString);
cout << "copying... \n";
strncpy(args[i], nativeString, len);
env->ReleaseStringUTFChars( (jstring)result, nativeString);
}
Run Code Online (Sandbox Code Playgroud)
但是当i= 1时,我在Java中遇到内存冲突错误.如何正确地将接收到的字符串中的数据复制到char * args[10]?从Java传递的每个字符串的长度大约是3-5个字符.
我有一个int变量,我想创建一个String返回该int变量的方法,我该怎么做呢?以下示例...并设置getAge()方法在年龄为18时返回"年轻",在年龄为30时返回"年龄".
private int age;
public String getAge() {
}
Run Code Online (Sandbox Code Playgroud) 我想做以下事情:
#include <windows.h>
#include <stdio.h>
#define N 400000
void main() {
int a[N];
}
Run Code Online (Sandbox Code Playgroud)
我得到一个stackoverflow异常.我的电脑有6GB的主内存,所以我无法全部使用它.我该如何解决这个问题?我在Windows 7上使用VS 2008并在C中编码.
我发现这在Microsoft Visual C++ 2010中编译.
void main()
{
int i=9;
while (i>4)
{
i--;
}
while (i>6);
}
Run Code Online (Sandbox Code Playgroud)
可能不会......第二次似乎没有效果