我想在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);
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) 我试图在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退出状态
以下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) 好的,伙计们,我已经阅读了很多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.
我正在努力创建我的自定义对象类型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片段调用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) 我正在尝试使用NDK for Android调试.so库.
我可以使用构建.so库ndk-build.但是当我想调试我的库时,我设置ndk-build NDK_DEBUG = 1并收到以下错误:make:*空变量名.停止.
而且我收到错误:Unable to launch cygpath. Is Cygwin on the path?
感谢任何帮助,谢谢
我正在关注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) 我有一些只有类文件的Java基准测试.
我想找到哪些基准测试有JNI调用.
我想也许这可以通过字节码级别来帮助javap -c,但不确定.
有任何想法吗?