标签: java-native-interface

从JNI在Android上调用非静态方法

我想在Android上使用JNI调用非静态方法.我可以使用调用静态方法 CallStaticVoidMethod.为了调用非静态方法,我已经使用过了CallVoidMethod.它不起作用.

任何人都可以告诉我正确的代码从JNI调用Android的非静态方法?

jmethodID method = env->GetMethodID(gJniRefCached.ImsFwkLoaderClass, "DispVideo", "([BII)V");
Run Code Online (Sandbox Code Playgroud)

env-> CallVoidMethod(gJniRefCached.ImsFwkLoaderClass,method,arr,width,height);

我也尝试过使用代码类的对象 jclass cls = env->GetObjectClass(obj); jmethodID method = env->GetMethodID(cls, "DispVideo", "([BII)V"); env->CallVoidMethod(cls, method,arr,width,height);

java-native-interface android android-ndk

0
推荐指数
1
解决办法
8272
查看次数

如果类存在于类中,则为JNI函数名

MethodNameJNI函数可能如下所示:

JNIEXPORT void JNICALL Java_ClassName_MethodName(JNIEnv *env, jobject obj)
{
     //...
}
Run Code Online (Sandbox Code Playgroud)

我在Java方面的代码是:

public class ClassName
{
    private class ClassName2
    {
        MethodName();
    }
}
Run Code Online (Sandbox Code Playgroud)

我不知道,如何写本机函数的名称; 任何组合去链接错误:

JNIEXPORT void JNICALL Java_ClassName_ClassName2_MethodName(JNIEnv *env, jobject obj);

JNIEXPORT void JNICALL Java_ClassName2_MethodName(JNIEnv *env, jobject obj);

JNIEXPORT void JNICALL Java_ClassName_MethodName(JNIEnv *env, jobject obj);
Run Code Online (Sandbox Code Playgroud)

java java-native-interface

0
推荐指数
1
解决办法
870
查看次数

将C++静态库与android ndk链接时出错(错误:无法识别文件格式)

我试图在android中包含静态cpp库.这个库已经编译(在mac os上),我有它的包含文件.

这是我的Android.mk档案

LOCAL_PATH := $(call my-dir)
 include $(call all-subdir-makefiles)
    include $(CLEAR_VARS) 
    LOCAL_MODULE:= utils 
    LOCAL_SRC_FILES:= libUtils.a 
    LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/utils 
    include $(PREBUILT_STATIC_LIBRARY) 

    include $(CLEAR_VARS) 
    LOCAL_MODULE := sample 
    LOCAL_SRC_FILES := sample_cpp.cpp 
    LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH) 
    LOCAL_STATIC_LIBRARIES :=  utils
    LOCAL_LDLIBS    := -llog 
    include $(BUILD_SHARED_LIBRARY)
Run Code Online (Sandbox Code Playgroud)

这是Application.mk文件

APP_STL := stlport_static
APP_CPPFLAGS = -fexceptions  
Run Code Online (Sandbox Code Playgroud)

但每当它尝试使用NDK编译它我得到错误

(文件路径)/libUtils.a:文件无法识别:文件格式无法识别collect2:ld返回1退出状态

c++ java-native-interface android android-ndk

0
推荐指数
1
解决办法
3262
查看次数

从java传递的c中的打印数组:为什么不打印数组?

以下java片段调用c函数:

Java代码

 String s[] = new String[10];
    for(int i=0;i<10;i++) {
        s[i] = "s";
    }
    o.printArrayLength(s); // prints the array length from c code
Run Code Online (Sandbox Code Playgroud)

C代码:

void Java_Package_CallMethodOfSuperClass_printArrayLength
    (JNIEnv *env, jobject obj, jobjectArray arr) {

jsize size = (*env)->GetArrayLength(env,arr);
printf("\n");
printf("Size of array from C : ");
printf("%d",size);
jcharArray chrArr = (*env)->GetCharArrayElements(env,arr,NULL);
char Arr[11];
strcpy(Arr,chrArr);
int i = 0;
printf("Now printing the array declared in java from c :");
printf("SIZE SIZE SIZE SIZE : %d",size);
for(i=0;i<size;i++) {
    printf("Inside …
Run Code Online (Sandbox Code Playgroud)

c java arrays java-native-interface

0
推荐指数
1
解决办法
156
查看次数

无法使javah与我的Eclipse Android项目一起工作

好的,伙计们,我已经阅读了很多javah用法的例子,但仍然没有运气.我有Eclipse Android项目,所以我尝试以下:

cd /path_to_project/
javah -classpath ./bin/classes com.package.ClassName
Run Code Online (Sandbox Code Playgroud)

我得到了什么:

class file for android.app.Activity not found
Run Code Online (Sandbox Code Playgroud)

好的,所以,它看到我的类,我只需要将android.jar添加到classpath:

javah -classpath ./bin/classes:path_to_sdk/android.jar com.package.ClassName
Run Code Online (Sandbox Code Playgroud)

我得到:

Could not find class file for com.package.ClassName
Run Code Online (Sandbox Code Playgroud)

"你在开玩笑吧!你刚看到它,现在你找不到它!",我说.

请帮忙!我在这里绝望.

尝试使用javac编译简单的java类,然后使用javah - 它工作正常.

我的环境: Windows 7,cygwin.

java java-native-interface android javah

0
推荐指数
1
解决办法
1447
查看次数

对象数组数组(二维数组)JNI

我正在努力创建我的自定义对象类型ShareStruct的二维数组:

jobjectArray ret ;
jobjectArray ins ;
jobjectArray outs;

jclass myClass = (*env)->FindClass(env,"org/apache/s4/core/ShareStruct");
if (myClass==NULL) fprintf(stderr, "Class ShareStruct not found");

jclass myClassArray = (*env)->FindClass(env, "[Lorg/apache/s4/core/ShareStruct");
if (myClassArray==NULL) fprintf(stderr, "Class ShareStruct[] not found");

ins = (*env)->NewObjectArray(env, in, myClass, NULL);
outs = (*env)->NewObjectArray(env, out, myClass, NULL);
ret = (*env)->NewObjectArray(env, 2, myClassArray, NULL);
Run Code Online (Sandbox Code Playgroud)

第一个类加载有效(ShareStruct很好),而另一个(尝试加载ShareStruct []类)则无效。我已经尝试过带或不带L,但没有运气。有任何想法吗?我是JNI的新手。

谢谢!

java arrays java-native-interface

0
推荐指数
1
解决办法
8455
查看次数

为什么jvm崩溃,因为我回调了java函数?

以下java片段调用jni函数Java_org_suhail_keylogger_HelperClasses_NativeMethods_unregisterHook:

    private void jMenuItem1ActionPerformed(java.awt.event.ActionEvent evt) {                                           
    jMenuItem1.setEnabled(false);
    jMenuItem2.setEnabled(true);
    try {
       System.loadLibrary("Dll_PKeylogger"); // Load the dll written to listen to the tapping of keys
       nativeMethods.initializeJNIVars(); // called upon the object of a class named NativeMethods
    }catch(Exception exc) {
        exc.printStackTrace();
    }
}
Run Code Online (Sandbox Code Playgroud)

NativeMethods(类,其对象用于调用上面的JNI C方法):

public class NativeMethods {

  public native void initializeJNIVars();
  public native void unregisterHook();

  public void displayKeyStrokes() { // FUNCTION THAT IS CALLED BACK FROM JNI C CODE
    System.out.println("Java Message : A Key has been pressed");
  } …
Run Code Online (Sandbox Code Playgroud)

c java java-native-interface

0
推荐指数
1
解决办法
149
查看次数

Android ndk-build失败了

我正在尝试使用NDK for Android调试.so库.

我可以使用构建.so库ndk-build.但是当我想调试我的库时,我设置ndk-build NDK_DEBUG = 1并收到以下错误:make:*空变量名.停止.

而且我收到错误:Unable to launch cygpath. Is Cygwin on the path? 感谢任何帮助,谢谢

java-native-interface android cygwin makefile android-ndk

0
推荐指数
1
解决办法
5439
查看次数

JNI找不到本机方法(test \ Test.java:11:找不到符号)

我正在关注jni上的本教程

1)步骤使用方法制作了一个test \ Test.java文件

public native static int getDouble(int n);
Run Code Online (Sandbox Code Playgroud)

2)编译并生成头文件。(javac,javah)

3)创建一个VC Win32项目(应用程序类型:DLL)

4)将项目属性更改为包括

%JAVA_HOME%\include;%JAVA_HOME\include\win32\
Run Code Online (Sandbox Code Playgroud)

5)复制粘贴到vc项目中的test_Test.h。

6)Build> Confugration Manager(将平台更改为x64)

7)构建解决方案+将生成的.dll文件复制到Test.java类路径

8)更改Test.java以包括对本机函数调用的调用。

package test;

public class Test {

    public native static int getDouble(int n);

    public static void main(String[] args) {
        System.loadLibrary("jni_example");

        for (int n = 1; n <= 20; n++) {
            System.out.println(n + " x 2 = " + getDoubled(n));
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

9)再次尝试编译测试会出现问题。

D:\workspace\jni_example>ls
jni_example.dll  test  test_Test.h

D:\workspace\jni_example>javac -classpath . test\Test.java
test\Test.java:11: cannot find symbol
symbol  : method …
Run Code Online (Sandbox Code Playgroud)

c++ java java-native-interface

0
推荐指数
1
解决办法
1425
查看次数

给定一个类文件,如何检测它是否使用JNI?

我有一些只有类文件的Java基准测试.

我想找到哪些基准测试有JNI调用.

我想也许这可以通过字节码级别来帮助javap -c,但不确定.

有任何想法吗?

java java-native-interface bytecode javap .class-file

0
推荐指数
1
解决办法
233
查看次数